WSADATA WSAData;
BOOL flag = true;
int     nTimeout = 1000;
char    LocalName[16];
struct  hostent *pHost;
// 检查 Winsock 版本号
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
return false;
// 初始化 Raw Socket
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET)
return false;
// 设置IP头操作选项
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
return false;
// 获取本机名
if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
return false;
// 获取本地 IP 地址
if ((pHost = gethostbyname((char*)LocalName)) == NULL)
return false;
addr_in.sin_addr    = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family  = AF_INET;
addr_in.sin_port    = htons(57274);
 // 把 sock 绑定到本地地址上
if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
return false;DWORD dwValue = 1;
// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包
if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)
return false;
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);//函数在这里被阻塞总不返回********************
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);老是收不到数据,就是不返回,一直阻塞在那里,不知道是哪里有错,我还试过网上别的程序也是这样,不知道是什么原因,请指教另外请问如果是SOCK_RAW下,addr_in.sin_port = htons(57274);设置的端口有没有影响,是不是设置任意端口都可以?谢谢!

解决方案 »

  1.   

    什么端口是0?设置addr_in.sin_port为0?
      

  2.   

    现在问题原因已经找出来了
    把socket(AF_INET, SOCK_RAW, IPPROTO_RAW)改成socket(AF_INET, SOCK_RAW,IPPROTO_IP) 就好了但是不能明白这是什么原因,请指教一下啊,100分帖可不要就这么浪费了啊
      

  3.   

    现在问题已经解决了
    把sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))改成
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP) 
    就可以了,但是为什么这样呢,有什么区别,为什么很多别的例程都是用IPPROTO_RAW?
    请高手指教,给出答案立即给分呀!