用C语言并发回应服务器与客户端的代码
时间: 2023-07-16 14:13:15 浏览: 48
下面是一个简单的 C 语言代码示例,用于并发地响应客户端和服务器之间的通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#define MAX_CLIENTS 5
void *handle_client(void *);
int main(int argc, char *argv[]) {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
pthread_t tid;
// 创建 socket
if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Error while creating socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8080);
// 绑定 socket 到服务器地址
if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) {
perror("Error while binding socket");
exit(EXIT_FAILURE);
}
// 监听客户端连接请求
if (listen(server_socket, MAX_CLIENTS) == -1) {
perror("Error while listening to socket");
exit(EXIT_FAILURE);
}
printf("Server started and listening to port 8080\n");
// 接受客户端连接请求并为每个客户端创建新的线程
while (1) {
if ((client_socket = accept(server_socket, (struct sockaddr *) &client_addr, &client_len)) == -1) {
perror("Error while accepting client connection");
exit(EXIT_FAILURE);
}
if (pthread_create(&tid, NULL, handle_client, (void *) &client_socket) != 0) {
perror("Error while creating thread for client");
exit(EXIT_FAILURE);
}
printf("New client connected: %s\n", inet_ntoa(client_addr.sin_addr));
}
return 0;
}
void *handle_client(void *arg) {
int client_socket = *((int *) arg);
char buffer[1024];
ssize_t n;
// 读取客户端发送的消息并回复
while ((n = read(client_socket, buffer, sizeof(buffer))) != 0) {
if (n == -1) {
perror("Error while reading from client socket");
exit(EXIT_FAILURE);
}
buffer[n] = '\0';
printf("Received message from client: %s\n", buffer);
if (write(client_socket, buffer, strlen(buffer)) == -1) {
perror("Error while writing to client socket");
exit(EXIT_FAILURE);
}
}
printf("Client disconnected\n");
close(client_socket);
pthread_exit(NULL);
}
```
该代码使用 POSIX 线程库创建新线程以处理每个客户端连接。在主线程中,服务器通过一个无限循环来监听客户端连接请求。当新的客户端连接到服务器时,服务器将接受连接请求并为该客户端创建新的线程。每个线程都会负责与其相应的客户端通信,并在收到消息后回复该消息。