You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:27:00