套接字编程 - 奇怪的行为

时间:2013-04-23 01:02:48

标签: c++ sockets http posix

我正在尝试构建一个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响应放入一个字符串中,因为我有一个解析整个响应的对象。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

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();

我曾经多次使用它,因为我必须建立一个字符串,以便从不同的部分进行处理。你的旅费可能会改变。编译并尝试自己。我希望它有所帮助。

答案 1 :(得分:0)

您正在连续循环中读取套接字,直到套接字错误或断开连接,这在处理HTTP时完全错误。首先,服务器可能不会在响应结束时关闭连接,这会使代码死锁。

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