TCP C 程序自动重新连接到客户端

TCP C Program Autoreconnect to client

我目前有一个使用 TCP 远程连接的传感器。问题是远程位置不断断开连接,这是我不知道如何纠正我的代码的情况。我对我在做什么有 3/10 的想法,这段代码中的大部分行都来自互联网。

问题是,如何实现自动重新连接到我的 tcp 客户端的代码?尝试了很多方法,但似乎没有用。但是,只要连接是无缝的,代码就可以完美运行。

#include <stdio.h> 
#include <netdb.h> 
#include <netinet/in.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <time.h>
#define MAX 1000 
#define PORT 14344
#define SA struct sockaddr 

int main() 
{ 
        time_t t;
    time(&t);
    int sockfd, connfd, len; 
    struct sockaddr_in servaddr, cli; 
    unsigned char buff[MAX]; 
    int n,dd,a,b,c; 
    char timebuffer [80];
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
        strftime (timebuffer,80,"/home/%m%d%y_%H%M%S",timeinfo);  
    FILE *fil1;
    fil1=fopen(timebuffer,"wb");

    printf("%s",ctime(&t));

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd == -1) { 
        printf("socket creation failed...\n"); 
        exit(0); } 
    else
        printf("Socket successfully created..\n"); 

    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(PORT); 

    if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { 
        printf("socket bind failed...\n"); 
        exit(0); } 
    else    
    {
        printf("Socket successfully binded..\n"); 

        if ((listen(sockfd, 5)) != 0) { 
            printf("Listen failed...\n"); 
            exit(0); } 
        else
            printf("Server listening..\n");

        len = sizeof(cli); 

        connfd = accept(sockfd, (SA*)&cli, &len); 

        if (connfd < 0) { 
            printf("server accept failed...\n"); 
            exit(0); } 
        else    
            printf("server accepted...\n");

        while (1){
            bzero(buff, MAX); 
            dd=read(connfd, buff, sizeof(buff)); 
            printf("\n"); 

            for(a=0; a<=dd-1; a++){fprintf(fil1, "%c", buff[a]);printf("%02X", buff[a]);}

            printf("\n"); 
            bzero(buff, MAX);
            }
    }

        close(connfd);   
}

必须发送一些数据。如果您不发送数据,则无法保证您可以检测到丢失的连接。您可以可靠地判断另一端是否仍处于连接状态的唯一方法是,如果您尝试向它发送一些数据但它失败了。不尝试,你无法知道另一端是否存在。

接下来,您必须检查 read 的 return 值。如果出现错误,您需要关闭 connfd 并循环回 accept 调用以获取新连接。