C++多线程HTTP服务器socket请求同IP并发阻塞问题如何解决
C++多线程HTTP服务器同IP并发问题解决方案
问题根因
- 响应不符合HTTP协议规范:你当前的响应头使用
\n作为分隔符,违反了HTTP协议要求的\r\n头分隔规则,同时未显式声明Connection: close,HTTP/1.1默认启用长连接,浏览器会复用同一TCP连接发送同一域名下的多个请求,不会触发新的accept流程。 - 业务逻辑顺序错误:
sleep(10)放在recv之前,服务端长时间不读取请求,浏览器会判定该连接处于忙碌状态,同一域名的后续请求会排队等待空闲连接,不会新建TCP连接。
修复方案
1. 调整业务逻辑顺序
先读取客户端请求,再模拟业务耗时:
void send_response (int socket) { char buffer[2048] = {0}; int request = recv (socket, buffer, 2048, 0); if (request == -1) { perror ("recv error"); close(socket); return; } // 读完请求再模拟业务耗时 sleep (10); string message = "Hello from server"; string length = to_string (message.length ()); // 修正后的响应格式见下方 string hello = "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Content-Length: " + length + "\r\n" "Connection: close\r\n\r\n" + message; send (socket, hello.c_str (), hello.length (), 0); close (socket); }
2. 修正HTTP响应格式
使用符合协议要求的\r\n作为换行符,显式添加Connection: close头告知浏览器处理完请求即关闭连接,不要复用,对应调整代码中hello字符串的构造逻辑即可。
验证方法
不要使用同一浏览器的多个标签页测试,浏览器对同一域名默认有6个并发连接的限制且优先复用长连接,建议使用两个终端同时执行curl http://127.0.0.1:8080验证,可观察到两个请求同时在10秒后返回,符合并发预期。
内容的提问来源于stack exchange,提问作者Coffee'd Up Hacker
相关产品推荐
相关产品推荐

