以下是一个简单的Linux C Socket通信的示例,包括一个服务器和两个客户端之间的互相通信。

服务器代码(server.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define SERVER_PORT 8888

int main() {
    int serverSocket, clientSocket1, clientSocket2;
    struct sockaddr_in serverAddr, clientAddr1, clientAddr2;
    char buffer[MAX_BUFFER_SIZE];

    // 创建服务器套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket < 0) {
        perror("创建套接字失败");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(SERVER_PORT);

    // 绑定套接字到服务器地址
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        perror("绑定套接字失败");
        exit(EXIT_FAILURE);
    }

    // 监听客户端连接
    if (listen(serverSocket, 2) < 0) {
        perror("监听连接失败");
        exit(EXIT_FAILURE);
    }

    printf("服务器启动,等待客户端连接...\n");

    // 接受第一个客户端连接
    socklen_t clientAddrSize1 = sizeof(clientAddr1);
    clientSocket1 = accept(serverSocket, (struct sockaddr *)&clientAddr1, &clientAddrSize1);
    if (clientSocket1 < 0) {
        perror("接受第一个客户端连接失败");
        exit(EXIT_FAILURE);
    }
    printf("客户端1连接成功\n");

    // 接受第二个客户端连接
    socklen_t clientAddrSize2 = sizeof(clientAddr2);
    clientSocket2 = accept(serverSocket, (struct sockaddr *)&clientAddr2, &clientAddrSize2);
    if (clientSocket2 < 0) {
        perror("接受第二个客户端连接失败");
        exit(EXIT_FAILURE);
    }
    printf("客户端2连接成功\n");

    // 服务器开始转发数据
    while (1) {
        memset(buffer, 0, MAX_BUFFER_SIZE);

        // 从第一个客户端接收数据
        if (recv(clientSocket1, buffer, MAX_BUFFER_SIZE, 0) < 0) {
            perror("接收第一个客户端数据失败");
            exit(EXIT_FAILURE);
        }

        // 将数据发送给第二个客户端
        if (send(clientSocket2, buffer, strlen(buffer), 0) < 0) {
            perror("发送数据给第二个客户端失败");
            exit(EXIT_FAILURE);
        }

        // 从第二个客户端接收数据
        if (recv(clientSocket2, buffer, MAX_BUFFER_SIZE, 0) < 0) {
            perror("接收第二个客户端数据失败");
            exit(EXIT_FAILURE);
        }

        // 将数据发送给第一个客户端
        if (send(clientSocket1, buffer, strlen(buffer), 0) < 0) {
            perror("发送数据给第一个客户端失败");
            exit(EXIT_FAILURE);
        }
    }

    // 关闭套接字
    close(clientSocket1);
    close(clientSocket2);
    close(serverSocket);

    return 0;
}

客户端1代码(client1.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888

int main() {
    int clientSocket;
    struct sockaddr_in serverAddr;
    char buffer[MAX_BUFFER_SIZE];

    // 创建客户端套接字
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket < 0) {
        perror("创建套接字失败");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
    serverAddr.sin_port = htons(SERVER_PORT);

    // 连接服务器
    if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        perror("连接服务器失败");
        exit(EXIT_FAILURE);
    }
    printf("客户端1连接服务器成功\n");

    // 客户端1开始发送和接收数据
    while (1) {
        memset(buffer, 0, MAX_BUFFER_SIZE);

        // 从标准输入读取数据
        printf("请输入发送给客户端2的消息:");
        fgets(buffer, MAX_BUFFER_SIZE, stdin);

        // 发送数据给服务器
        if (send(clientSocket, buffer, strlen(buffer), 0) < 0) {
            perror("发送数据给服务器失败");
            exit(EXIT_FAILURE);
        }

        // 从服务器接收数据
        if (recv(clientSocket, buffer, MAX_BUFFER_SIZE, 0) < 0) {
            perror("接收数据失败");
            exit(EXIT_FAILURE);
        }

        printf("客户端2的回复:%s\n", buffer);
    }

    // 关闭套接字
    close(clientSocket);

    return 0;
}

客户端2代码(client2.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888

int main() {
    int clientSocket;
    struct sockaddr_in serverAddr;
    char buffer[MAX_BUFFER_SIZE];

    // 创建客户端套接字
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket < 0) {
        perror("创建套接字失败");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址
    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);
    serverAddr.sin_port = htons(SERVER_PORT);

    // 连接服务器
    if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        perror("连接服务器失败");
        exit(EXIT_FAILURE);
    }
    printf("客户端2连接服务器成功\n");

    // 客户端2开始发送和接收数据
    while (1) {
        memset(buffer, 0, MAX_BUFFER_SIZE);

        // 从标准输入读取数据
        printf("请输入发送给客户端1的消息:");
        fgets(buffer, MAX_BUFFER_SIZE, stdin);

        // 发送数据给服务器
        if (send(clientSocket, buffer, strlen(buffer), 0) < 0) {
            perror("发送数据给服务器失败");
            exit(EXIT_FAILURE);
        }

        // 从服务器接收数据
        if (recv(clientSocket, buffer, MAX_BUFFER_SIZE, 0) < 0) {
            perror("接收数据失败");
            exit(EXIT_FAILURE);
        }

        printf("客户端1的回复:%s\n", buffer);
    }

    // 关闭套接字
    close(clientSocket);

    return 0;
}

编译和运行:

  1. 打开终端,进入代码所在的目录。
  2. 编译服务器代码:gcc server.c -o server
  3. 编译客户端1代码:gcc client1.c -o client1
  4. 编译客户端2代码:gcc client2.c -o client2
  5. 启动服务器:./server
  6. 在另外两个终端中分别启动客户端1和客户端2:./client1./client2
  7. 在客户端1的终端中输入要发送给客户端2的消息,回车发送。
  8. 在客户端2的终端中输入要发送给客户端1的消息,回车发送。
  9. 服务器会将消息转发给对应的客户端,并将客户端的回复返回给发送方。

请注意,此示例仅用于演示基本的Socket通信,没有进行错误处理和异常情况处理。在实际开发中,需要对错误进行适当处理

Linux c socket通信 想做一个服务器做中转数据了 两个客户端进行互相通信

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

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