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

相关文章:

  • 2022-01-07
  • 2021-08-12
  • 2021-09-04
  • 2022-02-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-03
  • 2022-12-23
  • 2021-10-06
  • 2022-12-23
  • 2021-06-15
  • 2021-06-08
相关资源
相似解决方案