我正在尝试构建一个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响应放入一个字符串中,因为我有一个解析整个响应的对象。任何帮助将不胜感激!
答案 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中列出的规则,以了解响应的结构,该结构控制如何读取响应以及如何知道响应的时间回复完成。