使用winsock,如何从IE接收POST Http消息

时间:2012-01-17 14:28:12

标签: c++ xmlhttprequest winsock

我有一个带有函数receiveNetworkData(...)的C ++应用程序。此功能对于下载互联网上的任何其他页面非常有用。这个f-c的正文在这里:

int receiveNetworkData(int socket, string *receive_data) {
  int size, receive_size = 0;
  char buf[BUFSIZE];

  clearBuffer(buf);
  receive_data->clear();
  while (((size = recv(socket, buf, BUFSIZE-1, 0)) != 0) && (size != -1)) {
    receive_size += size;
    *receive_data += buf;
    clearBuffer(buf);
  }

  if (size == -1) return -1;
  return receive_size;
}

但是当我尝试使用此功能从IE获取http请求时。 recv功能正在阻止该程序。 我发现IE正在用两个TCP数据包发送POST请求。这是真的,但有时IE只发送一个数据包。现在recv只是等待tird包。我不知道如何识别来自IE的消息结束。

这是来自IE9的发送请求的JavaScript代码。

  http_zadost.open('POST', 'http://localhost:8001/', true);      
  http_zadost.setRequestHeader("Content-length", 5);
  http_zadost.setRequestHeader("Connection", "close");  
  http_zadost.send("check");

1 个答案:

答案 0 :(得分:1)

创建时,所有套接字都阻止。这意味着从他们那里读取的操作将阻止,直到可以满足调用。

recv的情况下,如果套接字阻塞,则该函数将阻止执行,直到收到所有请求的数据。在您的情况下,recv将不会返回,直到BUFSIZE-1字节被放入缓冲区,或者发生错误。

要使用winsock使套接字无阻塞,可以使用函数ioctlsocket,如下所示:

u_long mode = 1;
ioctlsocket(sock, FIONBIO, &mode);

如果mode非零,则套接字将更改为非阻塞模式。

修改

重新阅读您的问题后,我发现问题是您不知道浏览器JavaScript的请求何时结束。来自HTTP协议的Wikipedia文章:

  

请求消息包含以下内容:

     
      
  • 请求行
  •   
  • 接头
  •   
  • 空行。
  •   
  • 可选的邮件正文。
  •   
     

请求行和标题必须全部以(即回车符后跟换行符)结束。空行必须只包含其他空格。

你必须阅读,直到你得到完整的标题,即你收到一个空行。然后你还应该知道是否有一个消息体要读(有一个非零“内容长度”标题)以及它有多大。

请注意,您仍然需要在我的回答中提到套接字非阻塞。