и снова RAW SOCKETS

From
Gennady Porev (2:5020/69.36)
To
All
Date
2002-11-02T19:56Z
Area
SU.WINDOWS.NT.PROG
Hi, All!

Тут я недавно спрашивал по поводу отправки raw TCP-пакетов. Один товарищ посоветовал сходить на www.sources.ru и там действительно есть вот что: http://www.sources.ru/cpp/cpp_raw_tcp_200.shtml
именно про то, как отправлять сырые TCP-пакеты.

Я всё сделал так как там, но опять-таки не ясен вопрос с IP_HDRINCL. Если эта константа действительна равна 2, то после включения этой опции сокет вообще отказывается что бы то ни было посылать, мотивируя это WSAGetLastError = 10049 = WSAEADDRNOTAVAIL. Вот пример. Пакет я собрал сам и проверил. Но посылать не хочет.

=== Cut ===
{$APPTYPE CONSOLE}
program RAWS;
uses  WinSock;
const IP_HDRINCL = $02;
var TCPIPPacket : array [0..$2F] of byte =
($45, $00, $00, $30, $12, $34, $40, $00, $7F, $06, $EA, $E8, $C3, $05, $19, $62,
 $42, $36, $E0, $0D, $34, $21, $00, $99, $87, $65, $43, $21, $00, $00, $00, $00,
 $70, $02, $20, $00, $65, $33, $00, $00, $02, $04, $05, $B4, $01, $01, $04, $02);
 WD : WSAData;
 S : TSocket;
 i : byte;
 Addr : sockaddr_in;
 r : Integer;
begin
 WSAStartUp(02,WD);
 S:=Socket(AF_INET,SOCK_RAW,IPPROTO_IP);
 i:=1;
 SetSockOpt(S,IPPROTO_IP,IP_HDRINCL,@i,SizeOf(i));
 Addr.sin_family:=AF_INET;
 Addr.sin_port:=0;
 Addr.sin_addr.S_addr:=inet_addr('66.54.224.13'); // { 42 36 E0 0D } - see above
 r:=sendto(S,TCPIPPacket,$30,0,Addr,SizeOf(sockaddr_in));
 Writeln(r);
 Writeln(WSAGetLastError);
 CloseSocket(S);
 WSACleanUp;
end.
=== Cut ===

Люди! Я понимаю, что легче всего послать в инет или в лес. Но ведь среди вас точно есть те, кто это уже делал. Не дайте засохнуть!

PS: Win2k, ессно.

 Relax -=- Gennady -=- icq: 13031700

--- GoldED/W32 3.0.1
 * Origin: WatchCat-UA (2:5020/69.36)