免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10984 | 回复: 4

[C] socket问题,自己写的客户端断线重连程序,,PC机上测试正常,ARM板上出错 [复制链接]

论坛徽章:
0
发表于 2010-10-18 15:27 |显示全部楼层
本帖最后由 fantansy 于 2010-10-18 15:39 编辑

如题,客户端循环向服务器发送一段字符串。当服务器关闭,再打开后,要求客户端能自动连上。服务器不用自己写,负责将客户端的发送字符打印出来。
但是在ARM板上测试时,客户端发送数据正常,但是当服务器关闭,客户端也跟着关闭,无任何出错信息。
  1. #include  <stdio.h>      
  2. #include <>
  3. int main(int argc,char* argv[])
  4. {
  5.         int a;
  6. if (argc != 3)
  7.         {  
  8.                 fprintf(stderr,"error input ! <codename>  <ip>  <port>\n");
  9.                 //exit(1);
  10.         }  



  11.         while(1)
  12. {

  13.         a = my_socket(argv[1],argv[2]);
  14.         printf("a : %d\n",a);
  15.         if(a == -2)
  16.         {
  17.         printf("/**************************\nretry to connect the server\n\n**************************************\n");
  18.         }
  19.                
  20.        
  21. }       
  22.        
  23. printf("here!!");
  24. return 0;
  25. }

  26. int my_socket(char *serv_ip,char *serv_port)
  27.         {  
  28.         int sockfd;
  29.         int numbytes;  
  30.          
  31.         char serverip[32];  
  32.                
  33.         int my_port;
  34.         char buf[]="ddkksldfksdlfkajsaldfksdlfa\n";

  35.         struct sockaddr_in their_addr;  
  36.        
  37.         struct timeval tv;
  38.                 fd_set rfds,xfds; //写描述符集,异常描述符集
  39.         int maxfd;

  40.        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)   //建立socket
  41.         {  
  42.                 perror("socket");
  43.         return -2;
  44.         }  

  45.         strcpy(serverip,serv_ip);
  46.        

  47.         bzero(&their_addr, sizeof(their_addr));   //一些设置
  48.         their_addr.sin_family = AF_INET;
  49.         their_addr.sin_port = htons(6060);//SERV_PORT
  50.         inet_pton(AF_INET, serv_ip, &their_addr.sin_addr);
  51.         printf("sockfd:%d\n",sockfd);

  52.                 if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1) //连接
  53.                         {
  54.                         perror("connect:\n");
  55.                 close(sockfd);
  56.                 return -2;

  57.                                 }

  58.                
  59.         FD_ZERO(&rfds);       
  60.         FD_ZERO(&xfds);               
  61.        
  62.         int n;
  63.         while(1)
  64.         {
  65.                
  66.         //sleep(1);
  67. FD_SET(sockfd,&rfds);

  68. FD_SET(sockfd,&xfds);//我想看看程序有没有什么异常

  69.                 tv.tv_sec=1;
  70.                 tv.tv_usec=0;

  71.                
  72.                 maxfd = sockfd + 1;
  73.          n = select(maxfd,NULL,&rfds,&xfds,&tv);
  74.         printf("n:%d\n",n);
  75.         if(n > 0 ){

  76.                        
  77.                 if(FD_ISSET(sockfd,&rfds))
  78.                 {
  79.                         numbytes=write(sockfd, buf, sizeof(buf));  //如果sockfd可写,那么发送一段字符到服务器
  80.                        
  81.                            if(numbytes <= 0)
  82.                                 {
  83.                              printf("numbytes error");
  84.                              close(sockfd);
  85.                                return -2;
  86.                                   }
  87.                        
  88.                         }//n>0
  89.                        
  90.         if(FD_ISSET(sockfd,&xfds))//判断是否有异常
  91.                 {
  92.                         printf("&xfds error");
  93.                         close(sockfd);       
  94.                         return -2;
  95.                 }
  96.        
  97.         }


  98.         if(n == 0)   //select 返回0,则重连
  99.                 {
  100.                 printf("select time out");
  101.                 close(sockfd);
  102.                 return -2;
  103.                                 }

  104.         if(n<0)          //select < 0也重连
  105.         {
  106.         printf("select < 0");
  107.         close(sockfd);
  108.         return -2;
  109.         }
  110.                
  111. }//while

  112. close(sockfd);
  113. return -2;
  114. }//my_socket  函数设定,出错返回-2



复制代码

论坛徽章:
0
发表于 2010-10-18 15:40 |显示全部楼层
期待高人指点,,

论坛徽章:
0
发表于 2010-10-18 16:17 |显示全部楼层
期待高手指点。。。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2010-10-18 17:06 |显示全部楼层
"当服务器关闭,再打开后,要求客户端能自动连上"
显然你的程序完全没有实现这个。
代码好乱。

另外:
应该在select(maxfd,NULL,&rfds,&xfds,&tv);
加上读判断
当读到==0的时候,服务器就关闭了,你可以在fork()一个程序再次连接服务器

TCP是四元素(对方端口,对方地址,本地端口,本地地址)来确定一个套接口的

论坛徽章:
0
发表于 2010-10-19 09:16 |显示全部楼层
SIGPIE信号?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP