Winsock socket için ethernet header nasıl oluşturulur?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Winsock socket için ethernet header nasıl oluşturulur?

Mesaj gönderen mero »

S.A arkadaşlar

Bir süreden beri Tcp,Udp,Icmp vs. packet gönderme işi ile uğraşıyorum.
Raw packet göndermek için uğraştım ama tam istediğim gibi gönderemedim.
Bulduğum örneklerde raw dan kasıtları IP headerı kendileri oluşturup sonra tcp veya udp headerı oluşturuyolar sonrada datayı ekleyip gönderiyorlar. Ama en üstte ethernet headerı windows kendi oluşturuyor.
Benim merak ettiğim ve deneyipde beceremediğim şey ethernet headerı oluşturmak.

Kod: Tümünü seç

   WSAStartup($0002, wsdata);

   sh := Socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

   bOpt := 1;

   SetSockOpt(sh, IPPROTO_IP, IP_HDRINCL, @bOpt, SizeOf(bOpt));//IP Headera kendimiz oluşturmamız için socketi ayarlıyor.
                                                               // Burda Ethernet header içinde benzer bir ayar olmalı diye düşünüyoorum.

   ret := SendTo(sh, buf, SizeOf(buf), 0, Remote, SizeOf(Remote));
   if ret = SOCKET_ERROR then
     Memo1.Lines.Add('sendto() failed: ' + IntToStr(WSAGetLastError))
   else
     Memo1.Lines.Add('send ' + IntToStr(ret) + ' bytes.');
Remote dediği sockaddr_in:

Kod: Tümünü seç

    Sockaddr_in = record
    case Integer of
      0: (sin_family: u_short;
        sin_port: u_short;
        sin_addr: TInAddr;
        sin_zero: array[0..7] of Char);
      1: (sa_family: u_short;
        sa_data: array[0..13] of Char)
Bulduğum örneklerde ethernet header ı kendileri oluşturmadıkları için sin_family,Sin_port ve sin_adrr kullanılmıştı.Sa_data yı 14 array görünce bunun ethernet header için kullanıldığını düşündüm headerı oluşturmaya çalıştım beceremedim. ilk 6 chara karşı tarafın MAC adresini yazdım. sonraki 6 taneye kendi MAC adresimi yazdım. Son ikisinede Ether type($0800) yazdım ama gene hata verdi. Socket error 10004 (Interrupted function call. ) Ama ilk 6 chara boradcast(ff:ff:ff:ff:ff:ff) yapınca 10013(Permission denied. )hatası verdi.
İşin içinden çıkamadım.
Hayırlı günler.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Hocam biraz araştırdım, dendiğine göre bunun api yoluyla yapılması mümkün değil.
Biri böyle birşey yapmak için kernel seviyesinde gerek fonksiyonu sağlamak için basit(!) bir driver kullanmış. Ve bu driverıda C# ta yazdığı bir program ile kullanmış.

http://www.codeproject.com/cs/internet/ ... packet.asp

"Ethernet link" protokolü diye aratırsan bu konuda yararlı şeyler bulabilirsin.

Ayrıca yapmak istediğin nedir ? Araştırma amaçlımı uğraş veriyorsun?
mero
Üye
Mesajlar: 109
Kayıt: 04 Mar 2005 04:54

Mesaj gönderen mero »

Hocam yaklaşık 1 hafatadır bu işle uğraşıyorum işin neresinden tutup ne tarafa gideceğimi bilmeden. Sonunda Winsock'a geldim buldum diye sevinip uğraştım ama gene beceremedim.
Foruma yazmak aklıma geldi ama
Ayrıca yapmak istediğin nedir ?
Böyle bir soru ile karşılaşmaktan çekindim. Çünkü yapmaya çalıştığım şeyi direk yazarsam yanlış anlaşımaktan çekindim.
Bu konuyu araştırmaktaki niyetim şer işlemek değil. Şerri hayırda kullanmak desem yanlış olmaz.

Arp Request ve Reply göndermek.

Socektlerden başka delphi de yapabileceğim alternatif bir yöntem veya component de olabilir.
Cevapla