Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Анализ и обработка служебной информации [D5, Win2k]


ms_odin ©   (2006-04-21 09:36:00) 

День добрый, Мастера!
Прошу подсказать с направлением поисков:
для отладки девайса, связь с которым осуществляется через Ethernet, необходимо обрабатывать ВСЮ информацию, приходящую от него, т.е. и заголовки протоколов TCP и IP. Однако та же функция recvfrom из состава Winsock2, позволяет получить только непосредственно целевую информацию, котрая и находится в буфере приема.
Приведу пример: я передаю 1 Байт. функция recvfrom вернет значение 1 и этот байт в буфере. Но ведь передаваемый по сети пакет был как минимум 43 Байта!?
Вопрос: а как можно обратиться к заголовку, скажем, IP - пакета, чтобы посмотреть: версию, длину заголовка, флаги, TTL и все остальное?


ms_odin   (2006-04-24 15:23:00) [1]

Огромное спасибо!
Действительно, неправильно указывал тип протокла в Socket: смутило в примере, которым пользовался, буквы IP в константе  IPPROTO_UDP - даже не подумал, что указываю не тот протокол.
Все заработало, еще раз спасибо.


Сергей М.   (2006-04-24 10:10:00) [2]


> Прием пакета осуществляю так:
> ...
> RxSocket:= Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // открываем сокет для работы через UDP


А следует иначе:

RxSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_IP); // открываем сокет для работы непосредственно с IP


ms_odin   (2006-04-24 09:35:00) [3]

To Сергей М.
Спасибо за ответ, но мне все-равно не совсем понятно, как обратиться к этим самым "грязным" данным. Читаю мануал, там пишут:
The Windows Sockets socket function creates a socket which is bound to a specific service provider.

SOCKET socket (

   int af,
   int type,
   int protocol
  );
...
Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received only from this peer using recv.

Прием пакета осуществляю так:

var
 WSAData        : TWSAData;
 SockAddr        : TSockAddr;
 LenSockAddr   : INTEGER;
 RxSocket        : TSocket;
begin
WSAStartup($0002, WSAData);    // инициализируем WinSock
RxSocket:= Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);          // открываем сокет для работы через UDP
SockAddr.sin_family     := AF_INET;
 SockAddr.sin_port       := Htons(Port);
 SockAddr.sin_addr.s_addr:= inet_addr(Addr);
 LenSockAddr:= SizeOf(SockAddr);
 bind(RxSocket, @SockAddr, LenSockAddr);                       // связываем сокет с адресом
 Result:= RecvFrom(RxSocket, pBuf^, $FFFF, 0, SockAddr, LenSockAddr);
 CloseSocket(RxSocket);
 WSACleanup;
end;

Но указатель на принятый буфер содержит непосредственно переданную информацию, без служебки. Не могли бы Вы посоветовать, как к ней обратиться, или подсказать направление поисков?

To SPACE!!

Если для отладки, то  можно просто поискать хороший снифер ...
Насчет сырых сокетов, то для семейсвта ОС Windows не ниже 2000 .
Есть другие способы.

Простите, не очень понял ответ насчет сырых сокетов. :-)
Снифер не нужен - надо программулину писать.
Спасибо


SPACE!!   (2006-04-23 21:08:00) [4]

Если для отладки, то  можно просто поискать хороший снифер ...
Насчет сырых сокетов, то для семейсвта ОС Windows не ниже 2000 .
Есть другие способы.


Сергей М.   (2006-04-21 13:11:00) [5]

Эта ф-ция создает гнездо для работы с "грязными" данными, при этом прием-передача инф-ции осуществляется на уровне IP, т.е. то что тебе как раз нужно - заголовки и пр.


ms_odin   (2006-04-21 11:09:00) [6]

Простите, не очень понятно:

function socket( const af, struct, protocol: Integer ): TSocket; stdcall;


Эта функция меняет свои значения при каждом из принятых пакетов? Ведь заголовки каждый раз меняются. И когда ее вызывать - после recv?


Сергей М.   (2006-04-21 09:43:00) [7]

socket( AF_INET, SOCK_RAW, IPPROTO_IP );


Наверх

Титульная страница Поиск, карта сайта Написать письмо