Доброго времени суток, товарищи!
Решил я в целях самообучения поюзать сырые сокеты. Решил сделать простенькую консольную програмку, смысл которой ждать прихода ICMP пакета (пинга) и когда он придет, напечатать IP приславшего пакет и его размер. (код в конце поста)
Проблема в следующем...Когда я отсылаю пакет себе (ping 127.0.0.1) все прекрасно работает, но вот если меня пингует удаленный компьютер ничего не выходит - программа так и висит на recvfrom ожидая маны небесной.
Есть вариант, что мешает антивирь - у меня стоит Панда с интегрированным фаерволлом...возможно такое?
Есть у кого нб какие либо соображения на этот счет?
Заранее благодарен!
Привожу код:
// Программа называется "попингуй" )
#include "stdio.h"
#include "winsock2.h"
#include "windows.h"
int main(int argc, char* argv[])
{
WSADATA wsd;
if (WSAStartup (MAKEWORD (2,2), &wsd) != 0) {
printf ("Error WSA init\n");
return 0;
}
SOCKET sc;
SOCKADDR_IN addr;
char buf [1024];
int len;
int fromlen;
int res;
fromlen = sizeof (addr);
len = sizeof (buf);
LPPROTOENT lpProtocolEntry;
int nProtocol;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if ((lpProtocolEntry = getprotobyname("icmp")) == NULL)
nProtocol = IPPROTO_ICMP;
else
nProtocol = lpProtocolEntry->p_proto;
sc = socket(AF_INET, SOCK_RAW, nProtocol);
if (sc == INVALID_SOCKET) printf ("INVALID SOCKET!");
if (bind (sc,(LPSOCKADDR) &addr,sizeof (addr)) != 0) printf ("CAN'T BIND!");
res = recvfrom (sc,buf,len,0,(LPSOCKADDR) &addr,&fromlen);
if (res == SOCKET_ERROR) {
printf ("An error! %d \n",GetLastError ());
}
else {
printf ("Length: %d\n",fromlen);
printf ("IP: %s\n", (LPSTR) inet_ntoa (addr.sin_addr) );
printf ("Msg: %s\n",buf);
MessageBox (0,"","",0);
}
return 0;
}