【问题标题】:Socket Programming - Weird Behavior套接字编程 - 奇怪的行为
【发布时间】:2013-04-23 01:02:47
【问题描述】:

我正在尝试构建一个 HTTP 客户端。到目前为止,我有一些东西需要一个 IP 地址并打印 http 响应,没问题。但是,当我尝试接受该响应并将其放入字符串中时,程序会挂起。

所以这行得通:

write(sockfd, sendBuff, strlen(sendBuff));
string s = "";

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    if(fputs(recvBuff, stdout) == EOF)
    {
        printf("\n Error : Fputs error\n");
    }
}

这不是:

write(sockfd, sendBuff, strlen(sendBuff));
string s = "";

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    s.append(recvBuff, strlen(recvBuff));
}

我真的很想将整个 http 响应放入一个字符串中,因为我有一个解析整个响应的对象。任何帮助将不胜感激!

【问题讨论】:

  • 为什么不直接使用n 而不是在n 位置放置0,然后查看0 与字符串开头的距离?
  • 有什么问题?除了“挂起”这个词,我没有看到任何其他信息。调试器说明了什么?和sn-p 1比较,追加后可以打印s吗?
  • 该代码没问题(尽管对于append,无需将recvBuff[n] 设置为0 或调用strlen,只需使用n 作为第二个附加参数)。也许您的套接字在测试期间掉线了?为什么不把fputs 和s.append 都放进去,看看它们在特定的运行中是否对应?
  • 好吧,比如说我去一个小网页——上面的模式很好用。但是,如果我转到像谷歌主页这样的大型页面,我的程序将像进入无限循环一样挂起。即使放置几分钟也不会完成。
  • 也许服务器没有关闭连接,以便在服务器端发生“实时”事件时推送它们

标签: c++ sockets http posix


【解决方案1】:

您是否考虑过使用字符串流来存储输出?您可以执行以下操作:

write(sockfd, sendBuff, strlen(sendBuff));
stringstream s;
s.str(""); // resets the internal string

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    s << recvBuff;
}

然后当你去处理生成的字符串时,你可以通过内部字符串缓冲区使用:

s.str();

我以前用过很多次,因为我必须建立一个字符串来处理不同的部分。你的旅费可能会改变。编译并自己尝试。希望对你有帮助。

【讨论】:

    【解决方案2】:

    您在连续循环中从套接字读取,直到套接字出错或断开连接,这在处理 HTTP 时是完全错误的事情。一方面,服务器可能不会在响应结束时关闭连接,这会导致代码死锁。

    HTTP 消息具有结构,但您完全忽略了这一事实。 要正确读取 HTTP 响应,您需要遵循RFC 2616 Section 4.4 中列出的规则以了解响应的结构,该结构控制如何读取响应以及如何知道响应何时完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多