求助,小弟的一个Socket问题

Ice_cream_nocry 2007-12-25 08:38:34

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协议,所以不能省,请教各位兄弟,该如何解决?
...全文
166 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
telepan 2008-06-15
  • 打赏
  • 举报
回复
应该是这一行吧,31端口也许被使用,设大点,1024以上吧,addr_in.sin_port = htons(31);
telepan 2008-06-15
  • 打赏
  • 举报
回复
addr_in.sin_port = htons(31);
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复
没有星星愿意指点下么?
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复
参数应该是支持的
我去查了
都是定义在winsock2.h里的
问题是 出错的因为什么呢
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复
e,我是winxp的 上面的程序你能编译运行么?
恩 按照那段提示就是说 设置的时候就算出错也不会提示,除非调用了bind。
问题是设置那一段出错在什么地方呢
我用的BCB6 帮助文档里确实没有IPPROTO_IP,IP_HDRINCL这两个参数可选
但是这个是我从书上看来的
难道说BCB6不支持?
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复
e,我是winxp的 上面的程序你能编译运行么?
恩 按照那段提示就是说 设置的时候就算出错也不会提示,除非调用了bind。
问题是设置那一段出错在什么地方呢
我用的BCB6 帮助文档里确实没有IPPROTO_IP,IP_HDRINCL这两个参数可选
但是这个是我从书上看来的
难道说BCB6不支持?
僵哥 2007-12-25
  • 打赏
  • 举报
回复
Note If the setsockopt function is called before the bind function, TCP/IP options will not be checked with TCP/IP until the bind occurs. In this case, the setsockopt function call will always succeed, but the bind function call can fail because of an early setsockopt failing.

按这个提示,有可能是设置的时候本身就出错了。
僵哥 2007-12-25
  • 打赏
  • 举报
回复
楼主的什么操作系统?我这里Win2k3 Ent没有问题。
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复
顶上去,各位兄弟帮下忙。
僵哥 2007-12-25
  • 打赏
  • 举报
回复
查了一下相关设置IPPROTO_IP,IP_HDRINCL的实例(包括MSDN的实例)全都是作为请求发起方的例子(也就是不调用bind)。不过没有具体的说明为什么。
僵哥 2007-12-25
  • 打赏
  • 举报
回复
其实我对SOCK_RAW不了解。楼主所选用的这种方式应该是属于工作在IP层,不知道是否可以进行bind.
Ice_cream_nocry 2007-12-25
  • 打赏
  • 举报
回复

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧