免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4408 | 回复: 11
打印 上一主题 下一主题

网络编程求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-10 17:16 |只看该作者 |倒序浏览
在做嗅探器时为什么以下的代码在vc可以返回真值,在c++builder里返回SOCKET_ERROR,就是说在c++builder里会执行exit(0); 在vc里不会执行进入。\r\n\r\nif   (bind(sock,   (PSOCKADDR)&saddr,   sizeof(saddr))   ==   SOCKET_ERROR)   \r\n {   \r\n  perror(\"bind\";   \r\n  exit(0);   \r\n  }\r\n  //throw   Exception(\"bind   error!\"; \r\n  /*   \r\n  val为输入输出参数,为1时执行,0时取消   \r\n  设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL     \r\n  的定义为:#define   SIO_RCVALL   _WSAIOW(IOC_VENDOR,1)   \r\n  */   \r\n  \r\n  if   (ioctlsocket(sock,   SIO_RCVALL,   &val)   !=   0)   \r\n  {   \r\n  perror(\"ioctlsocket\";   \r\n  printf(\"error   code:   %d\\n\",   WSAGetLastError());   \r\n  exit(0);   \r\n  }   \r\n\r\n\r\n\r\n\r\n具体这个函数:\r\nint   get_raw_sock(const   char   *ipaddr)   \r\n  {   \r\n  int   sock;   \r\n  struct   sockaddr_in   saddr;   \r\n  int   flag   =   1;   \r\n  unsigned   long   val   =   1;   \r\n    \r\n  sock   =   socket(AF_INET,   SOCK_RAW,   IPPROTO_IP);   \r\n  if   (sock   ==   INVALID_SOCKET)   \r\n  {   \r\n  perror(\"socket\";   \r\n  exit(0);   \r\n  }   \r\n  //设置IP头操作选项,其中flag   设置为ture,亲自对IP头进行处理     \r\n  if   (setsockopt(sock,   IPPROTO_IP,   IP_HDRINCL,   (char   *)&flag,   sizeof(flag))   ==   SOCKET_ERROR)   \r\n  {   \r\n  perror(\"setsockopt\";   \r\n  exit(0);   \r\n  }   \r\n  saddr.sin_family   =   AF_INET;   \r\n  saddr.sin_port   =   htons(7000);  \r\n  \r\n\r\n  ///ip转换\r\n  if   (ipaddr)   \r\n  {   \r\n  saddr.sin_addr.S_un.S_addr   =   inet_addr(ipaddr);   \r\n  }   \r\n  else   \r\n  {   \r\n  saddr.sin_addr.S_un.S_addr   =   htonl(INADDR_ANY);   \r\n  }  \r\n  /*\r\n  if   (bind(sock,   (struct   sockaddr   *)&saddr,   sizeof(struct   sockaddr))   ==   SOCKET_ERROR)   \r\n  {   \r\n  perror(\"bind\";   \r\n  exit(0);   \r\n  }   \r\n  */\r\n if   (bind(sock,   (PSOCKADDR)&saddr,   sizeof(saddr))   ==   SOCKET_ERROR)   \r\n {   \r\n  perror(\"bind\";   \r\n  exit(0);   \r\n  }\r\n  //throw   Exception(\"bind   error!\"; \r\n  /*   \r\n  val为输入输出参数,为1时执行,0时取消   \r\n  设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL     \r\n  的定义为:#define   SIO_RCVALL   _WSAIOW(IOC_VENDOR,1)   \r\n  */   \r\n  \r\n  if   (ioctlsocket(sock,   SIO_RCVALL,   &val)   !=   0)   \r\n  {   \r\n  perror(\"ioctlsocket\";   \r\n  printf(\"error   code:   %d\\n\",   WSAGetLastError());   \r\n  exit(0);   \r\n  }   \r\n  \r\n  return   sock;   \r\n  }

论坛徽章:
0
2 [报告]
发表于 2007-03-11 10:41 |只看该作者
不过还是谢谢你的关注

论坛徽章:
0
3 [报告]
发表于 2007-03-14 13:28 |只看该作者
不是啊,是我的问题太古怪了,大牛很厉害的,帮我解决了很多问题,在这里说声谢谢他

论坛徽章:
0
4 [报告]
发表于 2007-03-17 13:08 |只看该作者
有使用GetLastError()的到错误的返回值吗,建议你看一下返回值,cbc我也没有用过,一直用vc和ASCII C的

论坛徽章:
0
5 [报告]
发表于 2007-03-17 20:27 |只看该作者
它不是错误,只是执行一个函数返回失败,这样也可以查吗

论坛徽章:
0
6 [报告]
发表于 2007-03-19 12:44 |只看该作者
当然可以了,返回失败后,可以是使用GetLastError()获取当前的错误号,查询相关的socket error文档就可以获得错误信息。

论坛徽章:
0
7 [报告]
发表于 2007-03-24 11:51 |只看该作者
bind 函数\r\n功能:给套接口分配一个本地协议地址\r\n\r\n定义:\r\n\r\n#include <sys/types.h>\r\n#include <sys/socket.h>\r\n\r\nint bind(int sockfd, const struct sockaddr *my_addr, int addrlen);\r\n\r\nsockfd 是调用 socket 返回的文件描述符。\r\n\r\nmy_addr 是指向数据结构 struct sockaddr 的指针,保存地址(即端口和 IP 地址) 信息。\r\n\r\naddrlen 设置为 sizeof(struct sockaddr)。\r\n\r\n返回: 0—成功, -1---出错\r\n\r\n让内核自动处理地址ip和端口port\r\n\r\nmy_addr.sin_port = 0; /* choose an unused port at random */\r\nmy_addr.sin_addr.s_addr = INADDR_ANY; /* use my IP address */\r\n\r\nbind( ) 自己选择合适的端口:将0赋给 my_addr.sin_por。\r\n\r\n自动填上他所运行的机器的 IP 地址:my_addr.sin_addr.s_addr 设置为 INADDR_ANY。

论坛徽章:
0
8 [报告]
发表于 2007-03-24 12:28 |只看该作者
你说bcb里的函数和vc6.0里的函数不同?

论坛徽章:
0
9 [报告]
发表于 2007-03-24 12:29 |只看该作者
if (bind(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr)) == SOCKET_ERROR) \r\n{ \r\nperror(\"bind\"; \r\nexit(0); \r\n} \r\n\r\n这样在vc6.0里通过了,成功了,但移到bcb里就返回SOCKET_ERROR,不知为啥

论坛徽章:
0
10 [报告]
发表于 2007-03-27 21:21 |只看该作者
perror(\"bind\"; 的显示内容?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP