Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

Анализ и обработка служебной информации   Найти похожие ветки 

 
ms_odin   (2006-04-21 09:36) [0]

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


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

socket( AF_INET, SOCK_RAW, IPPROTO_IP );


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

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

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


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


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

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


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

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


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

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 .
Есть другие способы.

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


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


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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
2-1155992408
DillerXX
2006-08-19 17:00
2006.09.10
Можно ли в TStatusPanel сделать Progress Bar...


2-1156004062
ffo
2006-08-19 20:14
2006.09.10
Сменить запятую на точку


5-1139173939
homm
2006-02-06 00:12
2006.09.10
Хранение данных компонента


2-1156314634
Андрей Пазик
2006-08-23 10:30
2006.09.10
Создание кросс-массива


1-1153902051
Wolferio
2006-07-26 12:20
2006.09.10
Сравнить две папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский