以下是一个简单的本地回环测试程序,包括客户端重连服务器的功能:

服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8888
#define MAX_CONN 10

int main()
{
    int server_fd, client_fd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_len = sizeof(client_addr);
    char buffer[1024] = {0};
    int opt = 1;

    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置套接字选项,允许地址重用
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
    {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

    // 绑定地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接请求
    if (listen(server_fd, MAX_CONN) < 0)
    {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Server started, waiting for clients...\n");

    while (1)
    {
        // 接受客户端连接
        if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len)) < 0)
        {
            perror("accept failed");
            exit(EXIT_FAILURE);
        }

        printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        while (1)
        {
            // 接收客户端消息
            memset(buffer, 0, sizeof(buffer));
            if (read(client_fd, buffer, sizeof(buffer)) <= 0)
            {
                printf("Client disconnected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
                close(client_fd);
                break;
            }

            printf("Received message from client: %s\n", buffer);

            // 发送回复给客户端
            if (write(client_fd, buffer, strlen(buffer)) < 0)
            {
                perror("write failed");
                exit(EXIT_FAILURE);
            }
        }
    }

    close(server_fd);
    return 0;
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>

#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define MAX_RETRIES 3

int main()
{
    int client_fd;
    struct sockaddr_in server_addr;
    char buffer[1024] = {0};
    int retries = 0;

    // 创建套接字
    if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址和端口
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0)
    {
        perror("inet_pton failed");
        exit(EXIT_FAILURE);
    }

    // 连接服务器
    while (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    {
        if (retries >= MAX_RETRIES)
        {
            perror("connect failed");
            exit(EXIT_FAILURE);
        }

        retries++;
        printf("Connection failed, retrying in 5 seconds...\n");
        sleep(5);
    }

    printf("Connected to server: %s:%d\n", SERVER_IP, PORT);

    while (1)
    {
        // 发送消息给服务器
        printf("Enter message: ");
        fgets(buffer, sizeof(buffer), stdin);
        buffer[strcspn(buffer, "\n")] = '\0';

        if (write(client_fd, buffer, strlen(buffer)) < 0)
        {
            perror("write failed");
            exit(EXIT_FAILURE);
        }

        // 接收服务器回复
        memset(buffer, 0, sizeof(buffer));
        if (read(client_fd, buffer, sizeof(buffer)) <= 0)
        {
            perror("read failed");
            exit(EXIT_FAILURE);
        }

        printf("Received message from server: %s\n", buffer);
    }

    close(client_fd);
    return 0;
}

这个程序简单地实现了一个本地回环测试,即客户端向服务器发送消息,服务器接收到后回复同样的消息给客户端。如果客户端无法连接到服务器,将进行三次重试,每次间隔 5 秒。如果客户端和服务器断开连接,客户端将自动重新连接服务器。

注意:这个程序只是一个简单的示例,没有考虑到并发连接和多线程处理等问题。在实际应用中,请根据需要进行改进

用linux C写一个socket本地回环的测试程序包括客户端重连服务器

原文地址: https://www.cveoy.top/t/topic/dxil 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录