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
时间: 2024-10-11 06:32:13