Linux下C语言,tcpClient收发加重连

使用sscom作为客户端,在Linux下写一个小程序连接客户端,进行收发测试,包括异常重连。


#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <linux/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "debug_printf.h"
#include "network.h"
#include "includes.h"
/* Types ------------------------------------------------------------*/

/* Functions ------------------------------------------------------------------*/
#define SERVER_IP "192.168.0.12" // 目标服务器的IP地址
#define SERVER_PORT 8081         // 目标服务器的端口号
#define MAXDATASIZE 1024
#define RECONNECT_INTERVAL 5 // 重新连接的间隔时间(秒)
#define BUFFER_SIZE 1024
int netTest()
{
    int sockfd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];
    ssize_t num_bytes;
    bool connected = false;
    while(1)
    {
         if (!connected)
        {
            sockfd = socket(AF_INET, SOCK_STREAM, 0);
            if (sockfd < 0)
            {
                perror("socket creation failed");
                sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
                continue;
            }
            memset(&server_addr, 0, sizeof(server_addr));
            server_addr.sin_family = AF_INET;
            server_addr.sin_port = htons(SERVER_PORT);
            if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0)
            {
                perror("invalid address/ Address not supported");
                close(sockfd);
                sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
                continue;
            }

            // 尝试连接到服务器
            printf("Attempting to connect to %s:%d...\n", SERVER_IP, SERVER_PORT);
            if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
            {
                perror("connection failed");
                close(sockfd);
                sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
                continue;
            }

            printf("Connected to %s:%d\n", SERVER_IP, SERVER_PORT);
            connected = true; // 设置连接状态为已连接
        }
           // 客户端与服务器进行通信的循环
        while (connected)
        {
            // 从服务器读取数据
            num_bytes = recv(sockfd, buffer, BUFFER_SIZE - 1, 0);
            if (num_bytes < 0)
            {
                if (errno == EINTR)
                {
                    // 被信号中断,继续尝试读取(实际上在这个例子中可能不需要,因为外层有更大的循环)
                    continue;
                }
                else
                {
                    perror("recv failed");
                    // 这里通常意味着连接被服务器关闭了或者出现了其他网络错误
                    connected = false; // 设置连接状态为未连接,以便外层循环重新连接
                    break;             // 跳出通信循环,进入重新连接逻辑
                }
            }
            else if (num_bytes == 0)
            {
                // 服务器关闭了连接(正常情况下recv返回0表示连接关闭)
                printf("Server closed connection. Will attempt to reconnect...\n");
                connected = false; // 设置连接状态为未连接
                break;             // 跳出通信循环
            }
            else
            {
                // 处理接收到的数据
                buffer[num_bytes] = '\0'; // 确保字符串以null结尾
                printf("Received: %s\n", buffer);
                send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
            }
        }
        if (sockfd >= 0)
        {
            close(sockfd);
            sockfd = -1; 
        }
        printf("Disconnected. Will attempt to reconnect...\n");
        sleep(RECONNECT_INTERVAL);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值