fantansy 发表于 2010-10-18 15:27

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

本帖最后由 fantansy 于 2010-10-18 15:39 编辑

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



        while(1)
{

        a = my_socket(argv,argv);
        printf("a : %d\n",a);
        if(a == -2)
        {
        printf("/**************************\nretry to connect the server\n\n**************************************\n");
        }
               
       
}       
       
printf("here!!");
return 0;
}

int my_socket(char *serv_ip,char *serv_port)
        {
      int sockfd;
        int numbytes;
       
        char serverip;
               
        int my_port;
        char buf[]="ddkksldfksdlfkajsaldfksdlfa\n";

        struct sockaddr_in their_addr;
       
        struct timeval tv;
                fd_set rfds,xfds; //写描述符集,异常描述符集
        int maxfd;

       if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)   //建立socket
        {
                perror("socket");
        return -2;
        }

        strcpy(serverip,serv_ip);
       

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

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

                                }

               
        FD_ZERO(&rfds);       
        FD_ZERO(&xfds);               
       
        int n;
        while(1)
        {
               
        //sleep(1);
FD_SET(sockfd,&rfds);

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

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

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

                       
                if(FD_ISSET(sockfd,&rfds))
                {
                        numbytes=write(sockfd, buf, sizeof(buf));//如果sockfd可写,那么发送一段字符到服务器
                       
                           if(numbytes <= 0)
                              {
                             printf("numbytes error");
                             close(sockfd);
                             return -2;
                                  }
                       
                        }//n>0
                       
        if(FD_ISSET(sockfd,&xfds))//判断是否有异常
                {
                        printf("&xfds error");
                        close(sockfd);       
                        return -2;
                }
       
        }


        if(n == 0)   //select 返回0,则重连
                {
                printf("select time out");
                close(sockfd);
                return -2;
                                }

        if(n<0)          //select < 0也重连
        {
        printf("select < 0");
        close(sockfd);
        return -2;
        }
               
}//while

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



fantansy 发表于 2010-10-18 15:40

期待高人指点,,

fantansy 发表于 2010-10-18 16:17

期待高手指点。。。

chenzhanyiczy 发表于 2010-10-18 17:06

"当服务器关闭,再打开后,要求客户端能自动连上"
显然你的程序完全没有实现这个。
代码好乱。

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

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

marco_hxj 发表于 2010-10-19 09:16

SIGPIE信号?
页: [1]
查看完整版本: socket问题,自己写的客户端断线重连程序,,PC机上测试正常,ARM板上出错