linux socket reuse port 小测试
nginx就是 reuse port的, 指多个socket 绑在同一个 IP+port上进行监听。
内核会为其新建连接进行负载均衡。
随手做了个小测试如下:

代码
// 简单的单线程TCP服务器 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len = sizeof(client_addr); char buffer[BUFFER_SIZE]; int opt = -1; // 创建socket server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket创建失败"); return 1; } // 设置SO_REUSEADDR选项 - 允许地址重用 /* if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { perror("setsockopt(SO_REUSEADDR)失败"); close(server_fd); return -1; } */ // 设置端口重用选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) { perror("setsockopt(SO_REUSEPORT)失败"); close(server_fd); return 1; } // 配置服务器地址 19:27:25 [1/86] server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); // 绑定 if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("绑定失败"); return 1; } // 监听 if (listen(server_fd, 5) < 0) { perror("监听失败"); return 1; } printf("TCP服务器启动,监听端口 %d\n", PORT); while (1) { // 接受连接 client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len); if (client_fd < 0) { perror("接受连接失败"); continue; } printf("客户端已连接: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 处理客户端 while (1) { memset(buffer, 0, BUFFER_SIZE); int n = recv(client_fd, buffer, BUFFER_SIZE - 1, 0); if (n <= 0) break; printf("收到: %s", buffer); send(client_fd, buffer, strlen(buffer), 0); } printf("客户端断开连接\n"); close(client_fd); } close(server_fd); return 0; }
浙公网安备 33010602011771号