Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Отправка RAW пакета.

6 views
Skip to first unread message

Andrey Uvarov

unread,
Nov 19, 2005, 1:44:27 PM11/19/05
to
Привет All,

У меня есть программа-сервер.
Она инициализирует RAW сокет, слушает все и ждет чего-то.

Мне надо написать программу-клиент.
Она инициализирует RAW сокет, формирует пакет с чем-то.

Вот как мне сформировать такой пакет? И куда вставить это что-то. (Пароль)

Собственно для этого мне нужно:
1. Формат пакета IP. Hезнаю где найти. Все форумы переспрашивал. Думаю вы
знаете. Hашел тока сл. информацию. А данные?!?
2. Как его состовлять? И как отправить.

Прошу если можете то приведи пример.

И еще в пакете xSum - Должна быть правильной?

<<------------------------------------------->>

const
c_MagicPacketXSum = 0;
SIO_RCVALL = $98000001;
MAX_PACKET_SIZE = $10000; //65 536 bytes
c_BindPort = 64000;

type IPHeader = record
iph_verlen: PChar; // версия и длина заголовка
iph_tos: PChar; // тип сервиса
iph_length: Integer; // длина всего пакета
iph_id: Integer; // Идентификация
iph_offset: Integer; // флаги и смещения
iph_ttl: PChar; // время жизни пакета
iph_protocol: PChar; // протокол
iph_xsum: Integer; // контрольная сумма
iph_src: LongInt; // IP-адрес отправителя
iph_dest: LongInt; // IP-адрес назначения
end;

function BindRawSocket( ): TSocket;
var
WData: WSAData;
Sin: SockAddr_IN;
flag: integer;
begin
Flag := 1;
if WSAStartup( $0202, WData ) <> 0 then
begin
WSACleanup( );
Result := INVALID_SOCKET;
Exit;
end
else
begin
Result := Socket( AF_INET, SOCK_RAW, IPPROTO_IP );
// Turn promiscuous mode on.
IOCtlSocket( Result, SIO_RCVALL, Flag );
if Result = INVALID_SOCKET then Exit // Error
else
begin
sin.sin_family := AF_INET;
sin.sin_addr.S_addr := INADDR_ANY;
bind( Result, sin, SizeOf( sin ) ); // Bind socket.
end;
end;
end;

function RetryUntilNeededPacket( Sock: TSocket; CallBackProc: TThreadFunc ):
Boolean;
var
Buf: array[ 0..MAX_PACKET_SIZE - 1 ] of Char;
Need: Boolean;
PHeader: ^IPHeader;
ThId: LONGWORD;
begin
Need := True;
if Sock <> INVALID_SOCKET then
begin
while ( Need ) and ( Sock <> INVALID_SOCKET ) do
begin
FreeMemory( @Buf );
Recv( Sock, Buf, MAX_PACKET_SIZE, 0 );
PHeader := @Buf;
if PHeader.iph_xsum = c_MagicPacketXSUM then // Если не обязательно
правильный xSum то так...
if Assigned( CallBackProc ) then BeginThread( nil, 0, CallBackProc,
nil, 0, ThId );
{$IFDEF DEBUG}
Debug( IntToStr( PHeader.iph_xsum ), 'xsum' );
Debug( IntToStr( PHeader.iph_length ), 'lenght' );
Debug( IntToStr( PHeader.iph_id ), 'id' );
Debug( IntToStr( PHeader.iph_offset ), 'offset' );
Debug( IntToStr( PHeader.iph_src ), 'src' );
Debug( IntToStr( PHeader.iph_dest ), 'dest' );
{$ENDIF}
end;
Result := True;
end
else Result := False;
CloseSocket( Sock );
WSACleanup( );
FreeMemory( @Buf );
end;

//==================

var
Sock: TSocket;

Sock := BindRawSocket;
if not RetryUntilNeededPacket( Sock, @{Callback procedure} ) then
{$IFDEF DEBUG}
Debug( 'WinSock Bind Failed!', 'Error!' );
{$ENDIF}
Andrey Uvarov

Andrey Uvarov

unread,
Nov 21, 2005, 8:56:06 AM11/21/05
to
0 new messages