【问题标题】:Why would a blocking socket repeatedly return 0-length data?为什么阻塞套接字会重复返回 0 长度的数据?
【发布时间】:2009-11-14 18:49:12
【问题描述】:

我在 C++ 程序中使用标准 BSD 样式的套接字时遇到了一个重大问题。在下面的代码中,我连接到本地 Web 服务器,发送请求,然后简单地创建一个循环等待数据返回。我实际上确实收到了数据,但随后我得到了一个无穷无尽的 0 长度数据流,就好像它是一个非阻塞套接字一样。 Web 服务器可能没有终止连接,因为如果是这样,我会收到 -1 的长度。

请忽略我在下面的简单拼写错误,因为我是从内存中编写代码,而不是直接复制/粘贴。该代码在 OSX 和 Windows 上产生相同的结果。

int sock = socket(AF_INET, SOCK_STREAM, 0);

//assume serv_addr has been created correctly
connect(sock, (sockaddr*)&serv_addr, sizeof(serv_addr)) < 0);

std::string header = "GET / HTTP/1.1\r\n"
    "Host: 127.0.0.1:80\r\n"
    "Keep-Alive: 300\r\n"
    "Connection: keep-alive\r\n\r\n";

send(sock, header.c_str(), header.length()+1, 0);

for (;;) {
    char buffer[1024];
    int len = recv(sock, buffer, 1024, 0);
    cout << len << endl;
    //this outputs two numbers around 200 and 500,
    //which are the header and html, and then it
    //outputs and endless stream of 0's
}

【问题讨论】:

  • 不,recv 只会在客户端出错时返回 -1。如果服务器与您断开连接,您将得到一个 0,这基本上就像一个 EOF。

标签: c++ c networking network-programming sockets


【解决方案1】:

来自recv的手册页

For TCP sockets, the return value 0 means the peer has closed its half
     side of the connection.

【讨论】:

  • 当recv()返回0时,连接被关闭;但是,如果您想轮询(或等待)套接字以获取传入数据,请查看 select() 的手册页。
  • 哇,谢谢,我想这是我的一个误解,但是如果我指定“keep-alive”,为什么它会关闭连接?
  • Connection: keep-alive 只是一个建议; HTTP/1.1 服务器不必遵守它,旧的服务器甚至不知道它的含义。但更重要的是,一个适当防御的客户端总是准备好让服务器断开连接,无论协议是否允许它在状态机中的那个点这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2023-03-03
  • 2011-08-19
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多