Форум: "Сети";
Текущий архив: 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