Подскажите, пожалуйста! Хочу послушать трафик (dial-up). При вызове функции WSAIoctl(socket,98000001h,offset option,sizeof option, 0,0,offset nbts,0,0) (option dd 1) возвращается ошибка WSAEINVAL (10022). Если же младший байт option обнулить (option dd 100h), то вызов проходит успешно, но в дальнейшем функция recv ничего не ловит! В чем дело? Перерыл кучу материала - ничего! Кто-нибудь знает, в чем дело? Система: профессиональные окна хп, SP2. Может быть у меня проблемы с ws2_32.dll?
0x98000001 это ведь SIO_RCVALL? Первое на что хочу обратить внимание: если вы "привязали" (bind) сокет на MS TCP Loopback interface (127.0.0.1, по другому localhost) то SIO_RCVALL работать НЕ будет! (Т.е. "сырой" (RAW) сокет привязать то можно будет, но вот вызов WSAIoctl с SIO_RCVALL с RCVALL_ON (1) в таком случае будет возвращать ошибку 10022, сам на это наткнулся). Если вы привязали сокет не на "реальный" интерфейс, то дело именно в этом! В случае если вы обнулили младший байт то это равносильно отключению (RCVALL_OFF (0)) этой опции, и такой вызов будет проходить успешно (без ошибки). Естественно, в таком случае функция recv ничего ловить не будет, ведь вы же сами отключили прослушку пакетов! Видимо, функции WSAIoctl и ioctlsocket смотрят в данном случае только младший байт option (dd, DWORD и т.п.), раз прошел option 100h (или же 100h возможно соответствует какой то другой опции?), хотя я не проверял. Кстати, вроде можно сделать чуть проще, обойтись без вызова WSAIoctl, а просто ioctlsocket(hSocket, SIO_RCVALL, &option), где option имеет тип long (dd?, не силен я в ассемблере). Второе: исходящий трафик в случае PPP Dialup ловится не будет, только входящий! Дело в том, что сырые сокеты реализуются драйвером tcpip.sys через устройство \Device\RawIp, а в случае Dialup исходящий трафик идет, как я понял, "мимо" этого устройства, т.к. в WinNT такие типы подключений реализуются через свою серию драйверов (и если пишется, допустим, firewall определенного типа, то в случае PPP приходится прибегать к дополнительным "извращениям"). Про это можно узнать, например, на http://www.hardline.ru/selfteachers/Info/Programming/Book.PogrammingSi stemSecurity/Glava%203/Index27.htm Вполне возможно, что насчет исходящего трафика я немного намудрил, буду очень рад если меня поправят, хотелось бы и исходящий трафик послушать ... P.S.: Сам проверял работу SIO_RCVALL на WinXP Pro Oem Rus SP1 с Dialup (обычный модем на 56k), поначалу все пытался включить SIO_RCVALL на 127.0.0.1 (хотел проверить работу на "локальном" трафике) и ничего не вышло, но как только привязал сокет к реальному адресу, то все сразу заработало. P.P.S.: Приаттачил пример rcvall из Platform SDK XPSP2, правда там, естественно, C, а не ассемблер. _829740134__rcvall.zip
Еще неплохая статья есть на http://rsdn.ru/article/net/sniffer.xml , правда примеры тоже на C. А также http://www.insidepro.com/kk/016/016r.shtml