2013-04-23 43 views
-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响应转换成一个字符串,因为我有一个分析整个响应的对象。任何帮助,将不胜感激!

+1

为什么不使用'n'而不是在位置'n'处放置一个'0',然后看看'0'是从字符串的开头开始的? – 2013-04-23 01:27:40

+0

问题是什么?除了“挂起”这个词,我没有看到任何其他信息。调试器告诉了什么?要与代码段1进行比较,可以在追加后打印's'吗? – Arun 2013-04-23 01:27:56

+0

该代码很好(尽管'append'不需要将'recvBuff [n]'设置为'0'或调用'strlen',只需使用'n'作为第二个附加参数)。在测试过程中,你的套接字是否掉线为什么不把'fputs'和's.append'放在一起,看看它们是否对应一个特定的运行? – 2013-04-23 01:32:28

回答

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

我有很多使用此之前那时我需要建立一个字符串来处理不同的部分。你的旅费可能会改变。编译并自己尝试。我希望它有帮助。

0

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

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