tingpan

生命不息,折腾不止!
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

socket 断线重连

Posted on 2015-11-30 22:43  tingpan  阅读(1365)  评论(0编辑  收藏  举报

send发送数据时,发送失败,进行如下重连处理:

if(send(sockfd, serbuf, readlen, 0) < 0)//serbuf中有数据可以发送才会执行这条语句
{
    printf("serial to tcp send msg error: %s(errno: %d)\n", strerror(errno), errno);//服务端断掉,则发送失败。
    //exit(0);
    
    //断线重连        
    sleep(3);        
    close(sockfd);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);//重新创建一个套接子,但描述符可能重复
    if (sockfd == -1) 
    {
        printf("recreate socket Error!!! Error # is %d. Exit!\n", errno);
        exit(-1);
    }
    printf("recreate sockfd is %d\n",sockfd);

    // connect to server
    while (-1 == connect(sockfd,(struct sockaddr *)(&servaddr), sizeof(servaddr))) 
    {
        printf("sockfd reconnect error: %s(errno: %d)\n",strerror(errno),errno);
        sleep(5);
    }                    
}

这样做看似没问题,但实验发现,只要服务器端断线了,执行send函数就会直接退出,根本无法重连。为了解决这个问题需要添加头文件

#include <signal.h>

另外在函数中send之前添加如下语句:

signal(SIGPIPE, SIG_IGN);    // prevent exiting when we send data to closed socket