Ошибка 10022 при чтении из сырого сокета.
От: homecat  
Дата: 02.01.13 08:40
Оценка:
Нужно ловить исходящие пакеты на заданный порт


WSAStartup(0x0202,&wsdata)
raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)


без проблем
пытаюсь читать

rec = recvfrom(raw_socket, (char *)buff, 1500, 0, NULL, NULL)



получаю ошибку WSAGetLastError() 10022

не пойму в чем дело, аналогичный код в линуксе работает на ура.

Биндить же не обязательно если я хочу получать все пакеты с любых интерфейсов?
Re: Ошибка 10022 при чтении из сырого сокета.
От: Аноним  
Дата: 02.01.13 14:57
Оценка:
Хоть смотрел то, что такое:
WSAGetLastError 10022
?????????????????????????????????????
Что-то типо инвалид аргумент, мусор подсовываешь значит, либо неправильный алгоритм вызова функций.
Re[2]: Ошибка 10022 при чтении из сырого сокета.
От: Nikolay_Ch Россия  
Дата: 02.01.13 15:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хоть смотрел то, что такое:

А>WSAGetLastError 10022
А>?????????????????????????????????????
А>Что-то типо инвалид аргумент, мусор подсовываешь значит, либо неправильный алгоритм вызова функций.
Стандартная ошибка нубов при использовании recv и recvfrom... Они считают, что несмотря на то, что в библиотеке параметр размера приемного буфера указан как указатель, они могут туда запихивать значение, а не ссылку...

Как это может работать в никсах, я не представляю. Или там настолько разнятся библиотеки?
Re[3]: Ошибка 10022 при чтении из сырого сокета.
От: homecat  
Дата: 02.01.13 16:36
Оценка:
N_C>Стандартная ошибка нубов при использовании recv и recvfrom... Они считают, что несмотря на то, что в библиотеке параметр размера приемного буфера указан как указатель, они могут туда запихивать значение, а не ссылку...

N_C>Как это может работать в никсах, я не представляю. Или там настолько разнятся библиотеки?


Я смотрел что значит ошибка... в никсах как то работает
если сделать
bind (raw_socket, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
то ошибки нет но и не работает как надо
Re[4]: Ошибка 10022 при чтении из сырого сокета.
От: Nikolay_Ch Россия  
Дата: 02.01.13 18:13
Оценка:
Здравствуйте, homecat, Вы писали:

А насколько необходимо использование recvfrom и протокола IPPROTO_RAW вместо IPPROTO_IP?
Re[4]: Ошибка 10022 при чтении из сырого сокета.
От: Nikolay_Ch Россия  
Дата: 02.01.13 18:28
Оценка:
Здравствуйте, homecat, Вы писали:

H>Я смотрел что значит ошибка... в никсах как то работает

H>если сделать
H>bind (raw_socket, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
H>то ошибки нет но и не работает как надо
ё... Новый Год делает свое черное дело... Ляпнул, не подумав, про буфер приема, когда надо было сказать про буфер адреса... Да и то — если он null — ничего страшного происходить не должно. Уж извините, погорячился с критикой...
Re[5]: Ошибка 10022 при чтении из сырого сокета.
От: homecat  
Дата: 03.01.13 06:18
Оценка:
В общем такая вещь
если открыть сокет так:

raw_socket = socket(PF_INET, SOCK_RAW, IPPROTO_IP);


а потом забиндить

struct sockaddr_in addr;
memset (&addr, 0, sizeof (struct sockaddr_in));
addr.sin_family = PF_INET;
addr.sin_addr.s_addr =     htonl( INADDR_ANY );
int w = bind (raw_socket, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));



то recvfrom работает не вываливается, но получает только ICMP и UDP может что то еще, а TCP в упор не видит, как будто нет такого.
Re[6]: Ошибка 10022 при чтении из сырого сокета.
От: homecat  
Дата: 03.01.13 13:07
Оценка:
Вопрос решился, мелкомягкие просто не любят простых путей.

открываем сокет так:

raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);


обязательно связываем с интерфейсом:

struct sockaddr_in addr;
memset (&addr, 0, sizeof (struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.0.2");
bind (raw_socket, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));


говорим КУ, одновременно приседаем и разводим руки:

DWORD  flag = RCVALL_ON; 
int io = ioctlsocket(raw_socket,SIO_RCVALL,&flag);



теперь можем спокойно получать все пакеты...
Re[7]: Ошибка 10022 при чтении из сырого сокета.
От: Nikolay_Ch Россия  
Дата: 03.01.13 15:18
Оценка:
Здравствуйте, homecat, Вы писали:

H>говорим КУ, одновременно приседаем и разводим руки:

H>
H>DWORD  flag = RCVALL_ON; 
H>int io = ioctlsocket(raw_socket,SIO_RCVALL,&flag);
H>

H>теперь можем спокойно получать все пакеты...
Но этот флаг отвечает за несколько другое, а именно за транзитный трафик, обычно проходящий мимо Вашей сетевой карты. Он не должен влиять на трафик, и так идущий на Вашу сетевую карту...
Re[6]: Ошибка 10022 при чтении из сырого сокета.
От: ononim  
Дата: 14.01.13 14:24
Оценка:
H>то recvfrom работает не вываливается, но получает только ICMP и UDP может что то еще, а TCP в упор не видит, как будто нет такого.
это могучая рука микрософта крепко держит вас за яйца (см Limitations on Raw Sockets)
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.