免费注册 查看新帖 |

Chinaunix

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

求解答~~~~~~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-15 14:11 |只看该作者 |倒序浏览
下面代码中,如果结构体中是数组则在运行过程中ACCEPT会失败,错误输出为accept error[-1]:Invalid argument
如果结构体为其他则运行一切正常.为什么,有人能解释下吗  谢谢
  1. struct send_info{
  2.     char len[11];      //换成int len;  则一切正常,accept正常运行
  3. };


  4. int main(int argc,char ** argv){
  5.         int i,len;
  6.         int socketfd,childfd;
  7.         char buff[100];
  8.         struct send_info s_temp;
  9.         struct sockaddr_in servaddr,childaddr;

  10.         if((socketfd=socket(AF_INET,SOCK_STREAM,0))<1){
  11.                 printf("socket error\n");
  12.                 exit(0);
  13.         }

  14.         bzero(&servaddr,sizeof(servaddr));
  15.         servaddr.sin_family=AF_INET;
  16.         servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  17.         servaddr.sin_port=htons(5543);
  18.         if(bind(socketfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
  19.                 printf("bind error\n");
  20.                 exit(0);
  21.         }
  22.         listen(socketfd,2);
  23.         while(1){
  24.                 bzero(&childaddr,sizeof(childaddr));

  25.                 if((childfd=accept(socketfd,(struct sockaddr*) &childaddr,&len))<0){
  26.                         printf("accept error[%d]:%s\n",childfd,strerror(errno));
  27.                         exit (0);
  28.                 }else{
  29.                         printf("accept ok\n");
  30.                 }
  31.                 printf("get a new connect form %s:%d\n",inet_ntop(AF_INET,&childaddr.sin_addr,buff,sizeof(buff)),ntohs(childaddr.sin_port));
  32.                
  33.                 close(childfd);
  34.         }

  35. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-02-15 14:24 |只看该作者
好像你根本没有用这个变量

论坛徽章:
0
3 [报告]
发表于 2011-02-15 14:27 |只看该作者
是的。只在第10行定义了。没有使用。
但拿掉这个定议或更改结构体。都能正常运行。
否则ACCEPT就出错

论坛徽章:
0
4 [报告]
发表于 2011-02-15 14:36 |只看该作者
accept 第三个参数为指针 指向的类型为int型 类型不匹配

论坛徽章:
0
5 [报告]
发表于 2011-02-15 14:41 |只看该作者
accept 第三个参数为指针 指向的类型为int型 类型不匹配
lwrsmy 发表于 2011-02-15 14:36



    accept(socketfd,(struct sockaddr*) &childaddr,&len)
    对的啊   &len

论坛徽章:
0
6 [报告]
发表于 2011-02-15 14:48 |只看该作者
len 的类型为int  只是c语言参数是传值 传地址才可以真正改变变量的值 不管这个变量是什么类型
要改变变量本身 必须传该变量的地址

论坛徽章:
0
7 [报告]
发表于 2011-02-15 14:51 |只看该作者
len 的类型为int  只是c语言参数是传值 传地址才可以真正改变变量的值 不管这个变量是什么类型
要改变变量 ...
lwrsmy 发表于 2011-02-15 14:48



     &len  这个好像就是传地址啊~~

论坛徽章:
0
8 [报告]
发表于 2011-02-15 14:56 |只看该作者
accept后面两个参数的意义:int accept(int sockfd, void *addr, int *addrlen)
int *addrlen 看到没 指针指向的类型为int型
你试着把char len[11]
强制转换 int len;

实际上从第一个字节开始解析 如果是char型 且系统对char第一为一个字节 则按char的编码进行解码
如果是int 则读取四个字节 按int编码进行解码

论坛徽章:
0
9 [报告]
发表于 2011-02-15 15:02 |只看该作者
我传递进ACCEPT的不是结构体里的len 是MAIN开头定义的int len;

论坛徽章:
0
10 [报告]
发表于 2011-02-15 15:04 |只看该作者
len调用前要先赋值
len=sizeof(...);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP