我写了个程序,但每到接受包时就陷入死循环,代码如下:
WSADATA WSAData;
char LocalName[128];
struct hostent *pHost;
BOOL flag = true;
int nTimeout = 1000;
//检查 Winsock 版本号
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
AfxMessageBox("WSAStartup error!"); //初始化 Raw Socket
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
AfxMessageBox("socket setup error!"); //设置IP头操作选项
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
AfxMessageBox("setsockopt IP_HDRINCL error!"); //获取本机名
if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
AfxMessageBox("gethostname error!"); //获取本地 IP 地址
if ((pHost = gethostbyname((char*)LocalName)) == NULL)
AfxMessageBox("gethostbyname error!"); addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(2004); //把 sock 绑定到本地地址上
if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
AfxMessageBox("bind error!");
dwValue = 1;
//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)
AfxMessageBox("ioctlsocket SIO_RCVALL error!"); recv(sock, RecvBuf, 65535, 0);//运行到这儿,便没有响应了
其中//char RecvBuf[65535];
WSADATA WSAData;
char LocalName[128];
struct hostent *pHost;
BOOL flag = true;
int nTimeout = 1000;
//检查 Winsock 版本号
if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
AfxMessageBox("WSAStartup error!"); //初始化 Raw Socket
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == INVALID_SOCKET)
AfxMessageBox("socket setup error!"); //设置IP头操作选项
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR)
AfxMessageBox("setsockopt IP_HDRINCL error!"); //获取本机名
if (gethostname((char*)LocalName, sizeof(LocalName)-1) == SOCKET_ERROR)
AfxMessageBox("gethostname error!"); //获取本地 IP 地址
if ((pHost = gethostbyname((char*)LocalName)) == NULL)
AfxMessageBox("gethostbyname error!"); addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(2004); //把 sock 绑定到本地地址上
if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
AfxMessageBox("bind error!");
dwValue = 1;
//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
if (ioctlsocket(sock, SIO_RCVALL, &dwValue) != 0)
AfxMessageBox("ioctlsocket SIO_RCVALL error!"); recv(sock, RecvBuf, 65535, 0);//运行到这儿,便没有响应了
其中//char RecvBuf[65535];
这里本来就是阻塞的,你这里要起个线程来处理数据。
ADSL是PPPOE的包,是数据链路层的,raw socket是抓不到这一层的包的