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);设置的端口有没有影响,是不是设置任意端口都可以?谢谢!
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);设置的端口有没有影响,是不是设置任意端口都可以?谢谢!
把socket(AF_INET, SOCK_RAW, IPPROTO_RAW)改成socket(AF_INET, SOCK_RAW,IPPROTO_IP) 就好了但是不能明白这是什么原因,请指教一下啊,100分帖可不要就这么浪费了啊
把sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))改成
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
就可以了,但是为什么这样呢,有什么区别,为什么很多别的例程都是用IPPROTO_RAW?
请高手指教,给出答案立即给分呀!