在linux中用C语言,通过创建线程阿里响应不同客户端的请求
时间: 2024-05-08 08:17:33 浏览: 84
Linux下的C语言多线程
可以使用pthread库来创建线程,具体步骤如下:
1. 创建一个监听套接字,等待客户端连接;
2. 当有客户端连接时,创建一个新的线程来处理客户端请求,并传入连接套接字作为参数;
3. 在新线程中,使用recv函数接收客户端发送的数据,并根据数据进行处理;
4. 处理完客户端请求后,使用send函数向客户端发送响应数据;
5. 关闭连接套接字,退出线程。
以下是一个简单的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 8888
#define MAX_CLIENTS 5
#define BUFFER_SIZE 1024
void *handle_client(void *arg) {
int client_sock = *(int *)arg;
char buffer[BUFFER_SIZE];
int read_size;
// 接收客户端请求数据
while ((read_size = recv(client_sock, buffer, BUFFER_SIZE, 0)) > 0) {
buffer[read_size] = '\0';
printf("Received message: %s\n", buffer);
// 处理客户端请求
// ...
// 发送响应数据
char *response = "Hello, client!";
send(client_sock, response, strlen(response), 0);
}
// 关闭连接套接字
close(client_sock);
// 退出线程
pthread_exit(NULL);
}
int main() {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(struct sockaddr_in);
pthread_t threads[MAX_CLIENTS];
int thread_count = 0;
// 创建监听套接字
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
perror("socket");
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_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_sock, MAX_CLIENTS) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server started on port %d\n", PORT);
// 接受客户端连接并创建线程处理请求
while (1) {
// 接受连接请求
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &addr_len);
if (client_sock == -1) {
perror("accept");
continue;
}
printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 创建新线程处理客户端请求
if (pthread_create(&threads[thread_count], NULL, handle_client, &client_sock) != 0) {
perror("pthread_create");
continue;
}
// 更新线程计数
thread_count++;
// 检查是否达到最大线程数
if (thread_count == MAX_CLIENTS) {
// 等待所有线程结束
for (int i = 0; i < MAX_CLIENTS; i++) {
pthread_join(threads[i], NULL);
}
// 重置线程计数
thread_count = 0;
}
}
// 关闭监听套接字
close(server_sock);
return 0;
}
```
阅读全文