C 中的多线程服务器客户端实现

c++客户端服务器

1个回答

写回答

061214

2025-07-09 16:35

+ 关注

服务器
服务器

使用C语言编写多线程服务器/客户端是一种常见的网络编程技术。这种技术可以使服务器同时处理多个客户端请求,并提高服务器的并发处理能力。下面我们来详细介绍一下如何使用C语言实现多线程服务器/客户端,并附上相应的案例代码。

1. 服务器端实现

首先,我们需要创建一个服务器端程序,用于监听客户端的连接请求,并为每个连接创建一个新的线程来处理客户端的请求。以下是一个简单的多线程服务器端的实现示例:

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <pthread.h>

#define MAX_CLIENTS 10

void *handle_client(void *arg) {

int client_socket = *(int *)arg;

char buffer[1024];

memset(buffer, 0, sizeof(buffer));

// 接收客户端消息

if (recv(client_socket, buffer, sizeof(buffer), 0) < 0) {</p> perror("接收消息失败");

close(client_socket);

pthread_exit(NULL);

}

// 处理客户端消息

// ...

// 发送响应消息给客户端

char response[] = "Hello, Client!";

if (send(client_socket, response, sizeof(response), 0) < 0) {</p> perror("发送消息失败");

}

close(client_socket);

pthread_exit(NULL);

}

int mAIn() {

int server_socket, client_socket;

struct sockaddr_in server_addr, client_addr;

socklen_t client_addr_len;

pthread_t tid;

// 创建服务器套接字

server_socket = socket(AF_INET, SOCK_STREAM, 0);

if (server_socket < 0) {</p> perror("创建套接字失败");

exit(1);

}

// 设置服务器地址

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = INADDR_ANY;

server_addr.sin_port = htons(8080);

// 绑定套接字到服务器地址

if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {</p> perror("绑定套接字失败");

exit(1);

}

// 监听连接请求

if (listen(server_socket, MAX_CLIENTS) < 0) {</p> perror("监听失败");

exit(1);

}

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

while (1) {

// 接受客户端连接

client_addr_len = sizeof(client_addr);

client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);

if (client_socket < 0) {</p> perror("接受连接失败");

exit(1);

}

printf("客户端 %s:%d 连接成功\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

// 创建新线程处理客户端请求

if (pthread_create(&tid, NULL, handle_client, &client_socket) < 0) {</p> perror("创建线程失败");

exit(1);

}

}

close(server_socket);

return 0;

}

在上述代码中,我们首先创建了一个服务器套接字,并将其绑定到指定的IP地址和端口上。然后,通过调用listen函数来监听客户端连接请求。接下来,我们使用一个无限循环来接受客户端连接,并为每个连接创建一个新的线程来处理客户端请求。在handle_client函数中,我们首先接收客户端发送的消息,然后处理消息,并发送响应消息给客户端。

2. 客户端实现

接下来,我们需要创建一个客户端程序,用于连接服务器并发送请求。以下是一个简单的多线程客户端的实现示例:

c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <pthread.h>

void *receive_response(void *arg) {

int server_socket = *(int *)arg;

char buffer[1024];

memset(buffer, 0, sizeof(buffer));

// 接收服务器响应消息

if (recv(server_socket, buffer, sizeof(buffer), 0) < 0) {</p> perror("接收消息失败");

} else {

printf("服务器响应:%s\n", buffer);

}

close(server_socket);

pthread_exit(NULL);

}

int mAIn() {

int server_socket;

struct sockaddr_in server_addr;

pthread_t tid;

// 创建客户端套接字

server_socket = socket(AF_INET, SOCK_STREAM, 0);

if (server_socket < 0) {</p> perror("创建套接字失败");

exit(1);

}

// 设置服务器地址

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

server_addr.sin_port = htons(8080);

// 连接服务器

if (connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {</p> perror("连接服务器失败");

exit(1);

}

printf("已连接到服务器\n");

// 创建接收响应的线程

if (pthread_create(&tid, NULL, receive_response, &server_socket) < 0) {</p> perror("创建线程失败");

exit(1);

}

// 发送请求消息给服务器

char request[] = "Hello, Server!";

if (send(server_socket, request, sizeof(request), 0) < 0) {</p> perror("发送消息失败");

}

pthread_join(tid, NULL);

return 0;

}

在上述代码中,我们首先创建了一个客户端套接字,并设置服务器的IP地址和端口。然后,通过调用connect函数来连接服务器。接下来,我们创建一个新线程来接收服务器的响应消息。在receive_response函数中,我们接收服务器发送的响应消息,并将其打印出来。然后,我们发送请求消息给服务器,并等待接收线程的结束。

使用C语言编写多线程服务器/客户端可以提高服务器的并发处理能力,使服务器能够同时处理多个客户端的请求。在这篇文章中,我们详细介绍了如何使用C语言实现多线程服务器/客户端,并给出了相应的案例代码。通过学习和理解这些代码,我们可以更好地掌握多线程服务器/客户端的实现原理和技术。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号