#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define BUFFER_SIZE 1024
void *handle_client(void *arg) {
int client_fd = *((int *)arg);
free(arg);
char buffer[BUFFER_SIZE];
// 阻塞式读取 - 线程会在这里等待数据
while (1) {
int bytes_read = read(client_fd, buffer, BUFFER_SIZE);
if (bytes_read <= 0) {
break;
}
// 简单的回显服务
write(client_fd, buffer, bytes_read);
}
close(client_fd);
pthread_exit(NULL);
}
int main() {
int server_fd;
struct sockaddr_in address;
int addrlen = sizeof(address);
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("Setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 10) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
// 接受连接并为每个客户端创建新线程
while (1) {
int *client_fd = malloc(sizeof(int));
// accept是阻塞调用 - 会等待新连接
if ((*client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
free(client_fd);
continue;
}
pthread_t thread_id;
if (pthread_create(&thread_id, NULL, handle_client, client_fd) != 0) {
perror("Thread creation failed");
close(*client_fd);
free(client_fd);
continue;
}
// 分离线程以便自动回收资源
pthread_detach(thread_id);
}
return 0;
}