-1

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

4

2 回答 2

0

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

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

于 2013-04-23T03:16:05.763 回答
0

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

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

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

于 2013-04-23T01:16:06.153 回答