Здравствуйте, 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>