что я делаю не так???
ловит пакеты приходящие
только ко мне
только репли на пинг
int main(int argc, char* argv[])
{
char *Buffer = new char;
SOCKET Sock;
HOSTENT* hostinfo;
SOCKADDR_IN Addr;
SOCKADDR_IN rAddr;
long flag = 1;
WSADATA WSAData;
if(WSAStartup(0x0101,&WSAData))
{
cout << "cannot init WSADATA\n";
_getch();
exit(0);
}
if ( (Sock = WSASocket (AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0,0)) == SOCKET_ERROR)
{
cout << "cocket errror\n";
}
ZeroMemory( &Addr, sizeof(Addr) );
Addr.sin_family = AF_INET;
Addr.sin_addr.s_addr = INADDR_ANY;
bind(Sock, (SOCKADDR *)&Addr, sizeof(SOCKADDR));
ioctlsocket(Sock, SIO_RCVALL, (unsigned long*)&flag);
IPHeader* hdr = new IPHeader;
while( !_kbhit() )
{
int count;
count = recv( Sock, Buffer, sizeof(Buffer), 0 );
if( count >= sizeof(IPHeader) )
{
hdr = (IPHeader *)Buffer;
.....
}
}
closesocket( Sock );
WSACleanup();
return 0;
}
Здравствуйте, matros, Вы писали:
M>что я делаю не так???
M>ловит пакеты приходящие
M>только ко мне
На то он и RECVALL, чтобы ловить приходящие пакеты.

Чтобы ловить все пакеты надо писать фильтр-драйвер TDI или NDIS.
В NTDDK эти уровни хорошо описаны.
M>только репли на пинг
Чтобы ловились нормально все пакеты, нужен большой буффер,
а не однобайтовый (Note that you must supply a sufficiently large buffer)
Иначе даже пинги приходят с длиной -1

.
Кстати, а зачем один байт выделять в куче???
я 64K на стеке выделил и даже не задумался, еще бессмыслена строка
hdr = new IPHeader, судя по коду значение все равно потеряется.
Еще нужно выбрать тот интерфейс, который хочется прослушивать,
например INADDR_ANY заменить на *(unsigned long *) gethostbyname(NULL)->h_addr
The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.
А вообще повнимательней читайте документацию. Ниже приведен код, ловящий приходящие IP-датаграммы (DevStudio.NET 2003).
#include <stdio.h>
#include <winsock2.h>
#include <mstcpip.h>
void main(int argc, char* argv[])
{
SOCKET s;
do
{
WSADATA d;
if (WSAStartup(0x0101, &d))
{
puts("Could not find a usable version of Windows Sockets");
break;
}
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (s == SOCKET_ERROR)
break;
hostent *he = gethostbyname(NULL);
if (!he)
break;
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *(unsigned long *) he->h_addr;
if (bind(s, (sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR)
{
puts("Failed to bind socket");
break;
}
unsigned long argp;
if (ioctlsocket(s, SIO_RCVALL, &argp) == SOCKET_ERROR)
{
puts("Failed to change I/O mode");
break;
}
char buf[65536];
while (1)
{
int count = recv(s, buf, sizeof(buf), 0);
if (count == SOCKET_ERROR)
break;
for (int i = 0; i < count; i++)
putchar(buf[i] >= ' ' ? buf[i] : ' ');
putchar('\n');
putchar('\n');
}
}
while (0);
if (s != SOCKET_ERROR)
closesocket(s);
WSACleanup();
}
M>M>int main(int argc, char* argv[])
M>{
M> char *Buffer = new char;
M> SOCKET Sock;
M> HOSTENT* hostinfo;
M> SOCKADDR_IN Addr;
M> SOCKADDR_IN rAddr;
M> long flag = 1;
M> WSADATA WSAData;
M> if(WSAStartup(0x0101,&WSAData))
M> {
M> cout << "cannot init WSADATA\n";
M> _getch();
M> exit(0);
M> }
M> if ( (Sock = WSASocket (AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0,0)) == SOCKET_ERROR)
M> {
M> cout << "cocket errror\n";
M> }
M> ZeroMemory( &Addr, sizeof(Addr) );
M> Addr.sin_family = AF_INET;
M> Addr.sin_addr.s_addr = INADDR_ANY;
M> bind(Sock, (SOCKADDR *)&Addr, sizeof(SOCKADDR));
M> ioctlsocket(Sock, SIO_RCVALL, (unsigned long*)&flag);
M> IPHeader* hdr = new IPHeader;
M> while( !_kbhit() )
M> {
M> int count;
M> count = recv( Sock, Buffer, sizeof(Buffer), 0 );
M> if( count >= sizeof(IPHeader) )
M> {
M> hdr = (IPHeader *)Buffer;
M>.....
M> }
M> }
M> closesocket( Sock );
M> WSACleanup();
M>return 0;
M>}
M>
Здравствуйте, MrFlash, Вы писали:
M>>ловит пакеты приходящие
M>>только ко мне
MF>На то он и RECVALL, чтобы ловить приходящие пакеты.
MF>Чтобы ловить все пакеты надо писать фильтр-драйвер TDI или NDIS.
MF>В NTDDK эти уровни хорошо описаны.
Неправда ваша... При установке SIO_RECVALL ловятся ВСЕ пакеты данного интерфейса(в том числе и исходящие).
M>>только репли на пинг
MF>Чтобы ловились нормально все пакеты, нужен большой буффер,
В принципе не обязательно, просто всегда будет вылетать WSAEMSGSIZE.
MF>Еще нужно выбрать тот интерфейс, который хочется прослушивать,
MF>например INADDR_ANY заменить на *(unsigned long *) gethostbyname(NULL)->h_addr
MF>The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.
А вот это попробуйте (c) Бриллиантовая рука.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, MrFlash, Вы писали:
M>>>ловит пакеты приходящие
M>>>только ко мне
MF>>На то он и RECVALL, чтобы ловить приходящие пакеты.
MF>>Чтобы ловить все пакеты надо писать фильтр-драйвер TDI или NDIS.
MF>>В NTDDK эти уровни хорошо описаны.
А>Неправда ваша... При установке SIO_RECVALL ловятся ВСЕ пакеты данного интерфейса(в том числе и исходящие).
Неплохо было-бы подкрепить это заявление документально

В противовес есть две вещи:
1. программа, приведенная ранее (я не увидел в трейсах ни одного GET/POST)
2. пример в Platform SDK, называется rcvall, так вот он использует тот-же SIO_RCVALL.
Вот строчка из его readme.txt:
Once the socket is bound, the specified ioctl option is set and
subseqent receive operations will return incoming IP packets of the requested
type. Note that these ioctls are currently supported only for IPv4.
Это не повод поспорить, просто возможно я смогу кардинально упростить свой код, если действительно есть возможность получать в user-mode исходящие пакеты.