小弟的一个socket问题
http://topic.csdn.net/u/20071225/08/fdd06714-9e16-4266-9d40-69d3ffceb2a3.html
遇到了相同的问题, 有经验的朋友帮个忙,先谢谢了
附注:
这段代码在VC下是能够正常执行的, 但是C++ Builder就是不行;
去掉setsockopt也能正常Bind,但必须要设置。
原问题如下:
C/C++ code
WSADATA WSAData;
BOOL flag = true;
int nTimeOut =1000;
char LocalName[16];
SOCKADDR_IN addr_in;
struct hostent *pHost;
// const int BUFFER_SIZE =100;
SOCKET sock;
char RecvBuf[BUFFER_SIZE];
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)return ;
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))==INVALID_SOCKET)return ;
if(gethostname((char*)LocalName,sizeof(LocalName))==SOCKET_ERROR)return ;
if((pHost=gethostbyname((char*)LocalName))==NULL)return ;
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0];
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(31);
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)return ;
if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR)
{
int iTmp=WSAGetLastError();
return;
}
上面是部分源码,如果直接编译 那么就会在bind函数处出错 错误代码10049 提示地址出错。
但是 如果把 if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)return ;这一行去掉, 就可以正常bind。问题是由于我要去解析IP协议,所以不能省,请教各位兄弟,该如何解决?