【问题标题】:Reusing Client TCP Connection for HTTP为 HTTP 重用客户端 TCP 连接
【发布时间】:2011-04-23 15:03:59
【问题描述】:

既然我不调用close(http_socket_fd),为什么我不能在C Web 客户端中重用http 客户端套接字?对套接字文件描述符的第一次写入/读取工作得很好。任何/所有连续读取都返回零(几乎没有任何错误)。

基本上,我不想继续为连续请求重新创建新的客户端连接套接字到同一主机。在 C 中是否不可能重用打开的客户端套接字(已经启用了 HTTP 保持活动)以进行连续的读/写? Java http://www.mail-archive.com/httpclient-dev@jakarta.apache.org/msg04687.html

似乎有可能
Example: (PSEUDO_CODE)
MANY_DOMAINS=30,000;
//initial connection
do{
  http_socket_to_domain_x=open(NEW_TCP_SOCKET_PER_DOMAIN);
  get(initial_url_path);
  read(http_socket_to_domain_x,initial_http_response);
} while(EACH_DOMAIN)
for(LIST_OF_URLS FROM EACH_DOMAIN);
  //successive connections - NO RECREATING TCP SOCKET!
do{
  get(another_url_path);
  read(http_socket_to_domain_x,another_http_response);
} while(EACH_URL_PER_DOMAIN)
//finally
close(http_socket_to_domain_x);

【问题讨论】:

    标签: http sockets tcp reusability


    【解决方案1】:

    【讨论】:

    • 我使用 HTTP 1.1 和 keep-alive。我什至可以通过 netstat 看到连接保持打开状态,直到超时或被我的客户端(不是服务器)明确关闭。 HTTP 连接几乎不是问题。也许它与缓冲有关,就像上面涉及 Java 的情况一样。
    • 如果下一次读取返回零,无论是 Java 还是其他任何东西,服务器(或某处的代理)都会关闭您的连接。用wireshark检查电线上发生了什么。
    • Nikolai,我已经测试了 Web 客户端,即使使用我自己的 Web 服务器和客户端在第一次读取之后它仍然为零......尽管我可以毫无问题地编写连续的请求 - 但从来没有读回任何东西!不过感谢wireshark的提示,我今晚试试。
    • 那么你必须向我们展示真实的代码。有太多细节会出错。
    • 同意。从这种模糊的描述中很难弄清楚。我们需要查看实际代码或正在交换的实际套接字数据的日志。
    【解决方案2】:

    服务器可能正在关闭连接。您是否发送 HTTP/1.1 标头?请参阅http://www.io.com/~maus/HttpKeepAlive.html 了解更多信息。

    【讨论】:

    • 是的,我是先生。我使用 HTTP 1.1 和 keep-alive。事实上,服务器会返回适当的响应头来确认它。我受够了这个!我似乎无法通过它,而且它是如此关键,以至于能够。
    • 嗯,太糟糕了。抱歉,我无法提供更多帮助。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多