基于Linux的socket多线程通信(使用Linux Socket进行多线程通信)

基于Linux的Socket多线程通信是指在Linux系统中使用套接字(socket)进行通信,同时利用多线程技术来处理多个客户端连接。

图片[1]-基于Linux的socket多线程通信(使用Linux Socket进行多线程通信)-不念博客

以下是一个使用多线程的简单TCP回显服务器示例:

#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 <pthread.h>
#include <errno.h>

#define PORT 8080
#define BUFFER_SIZE 1024

void *client_handler(void *arg);

int main() {
    int listener, conn;
    struct sockaddr_in addr;
    socklen_t addrlen = sizeof(struct sockaddr_in);

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if (listener < 0) {
        perror("socket");
        exit(1);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("bind");
        exit(1);
    }

    if (listen(listener, 10) < 0) {
        perror("listen");
        exit(1);
    }

    printf("Server is listening on port %d...\n", PORT);

    while (1) {
        conn = accept(listener, (struct sockaddr *)&addr, &addrlen);
        if (conn < 0) {
            perror("accept");
            exit(1);
        }

        printf("Accepted connection from %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));

        pthread_t thread_id;
        if (pthread_create(&thread_id, NULL, client_handler, (void *)&conn) < 0) {
            perror("pthread_create");
            exit(1);
        }
    }

    close(listener);
    return 0;
}

void *client_handler(void *arg) {
    int conn = *(int *)arg;
    char buffer[BUFFER_SIZE];
    ssize_t n;

    while ((n = read(conn, buffer, BUFFER_SIZE)) > 0) {
        write(conn, buffer, n);
    }

    if (n < 0) {
        perror("read");
    }

    printf("Closing connection...\n");
    close(conn);

    return NULL;
}

在这个示例中,我们创建了一个TCP回显服务器,它在监听端口8080。

当收到客户端的连接请求时,服务器会接受这个连接并创建一个新线程来处理与客户端的通信。

线程函数client_handler负责处理客户端发送的数据,读取数据并将其回显给客户端。

当客户端关闭连接或发生错误时,服务器将关闭相应的套接字。

© 版权声明
THE END