建立一个网络层的raw socket ,接收数据,首先将它绑定在本机上,结果发现总是报错“bind error :10038”,不知何解,望各位赐教,谢谢建立和绑定socket的代码如下:
rs = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);/*在网络层使用的原始套接字*/
if(rs==INVALID_SOCKET)
{
printf("...........create error:%d\n",GetLastError());
return -1;
}
struct sockaddr_in dst;dst.sin_family=AF_INET;
dst.sin_port=htons(8888);
dst.sin_addr.S_un.S_addr=htonl(INADDR_ANY);if(0 != bind(us,(struct sockaddr*)&dst,sizeof(struct sockaddr)))
{
printf("bind error: %d\n",GetLastError());
return -1;
}setsockopt(rs,IPPROTO_IP,IP_HDRINCL,(char *)&b,sizeof(BOOL));DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(rs,SIO_RCVALL,&lpvBuffer,sizeof(lpvBuffer),NULL,0,&lpcbBytesReturned,NULL,NULL);nLen = recvfrom(rs,buf,1024,0,addr,&nAddrLen);
rs = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);/*在网络层使用的原始套接字*/
if(rs==INVALID_SOCKET)
{
printf("...........create error:%d\n",GetLastError());
return -1;
}
struct sockaddr_in dst;dst.sin_family=AF_INET;
dst.sin_port=htons(8888);
dst.sin_addr.S_un.S_addr=htonl(INADDR_ANY);if(0 != bind(us,(struct sockaddr*)&dst,sizeof(struct sockaddr)))
{
printf("bind error: %d\n",GetLastError());
return -1;
}setsockopt(rs,IPPROTO_IP,IP_HDRINCL,(char *)&b,sizeof(BOOL));DWORD lpvBuffer = 1;
DWORD lpcbBytesReturned = 0 ;
WSAIoctl(rs,SIO_RCVALL,&lpvBuffer,sizeof(lpvBuffer),NULL,0,&lpcbBytesReturned,NULL,NULL);nLen = recvfrom(rs,buf,1024,0,addr,&nAddrLen);
解决方案 »
- 【求助】初始化问题,谢谢大家
- 对WideCharToMultiByte返回值的迷惑
- 弱弱的问, CD储存的PCM的数据结构是怎样的?
- 类型转换的小问题!
- 求助:弹出对话框的问题
- 是微软搞错了吗?
- 50分问:如何编程实现禁用和启用网卡的功能,就像win2000中的禁用和启用
- 如何获得桌面的。。。。。?高分相送
- VC调用dos出现了很奇怪的问题
- 在doc/view结构中,在view类的成员函数中用GetDocument()可得到对应的doc,那么在doc类的成员函数中用什么可得到对应的view?
- 有关MFC重绘的问题--为什么我要激活别的窗口后才能看到重绘的效果?
- CString加法数据量大程序会假死!!求救
// 创建原始套节字
SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // 获取本地IP地址
char szHostName[56];
SOCKADDR_IN addr_in;
struct hostent *pHost;
gethostname(szHostName, 56);
if((pHost = gethostbyname((char*)szHostName)) == NULL)
return ; // 在调用ioctl之前,套节字必须绑定
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(0);
memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length); printf(" Binding to interface : %s \n", ::inet_ntoa(addr_in.sin_addr));
if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
return; // 设置SIO_RCVALL控制代码,以便接收所有的IP包
DWORD dwValue = 1;
if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)
return ;
// 开始接收封包
char buff[1024];
int nRet;
while(TRUE)
{
nRet = recv(sRaw, buff, 1024, 0);
if(nRet > 0)
{
DecodeIPPacket(buff);
}
}
closesocket(sRaw);
if(0 != bind(us,(struct sockaddr*)&dst,sizeof(struct sockaddr)))-----> if(0 != bind(rs,(struct sockaddr*)&dst,sizeof(struct sockaddr)))
多谢诸位....