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

标签 c++ xmlhttprequest winsock

我有一个带有函数 receiveNetworkData(...) 的 C++ 应用程序。此功能对于下载 Internet 上的任何其他页面非常有用。这个 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 func 正在阻止程序。 我发现 IE 在两个 TCP 数据包中发送 POST 请求。这是真的,但有时 IE 只发送一个数据包。现在 recv 只是等待第三个数据包。我不知道如何识别来自 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");

最佳答案

所有套接字在创建时都是阻塞的。这意味着像读取它们这样的操作将阻塞直到调用被满足。

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

要使用 winsock 使套接字成为非阻塞的,您可以使用函数 ioctlsocket像这样:

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

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

编辑

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

The request message consists of the following:

  • A request line
  • Headers
  • An empty line.
  • An optional message body.

The request line and headers must all end with (that is, a carriage return followed by a line feed). The empty line must consist of only and no other whitespace.

您必须阅读直到获得完整的标题,即您收到一个空行。然后您还应该知道是否有要读取的消息正文(有一个非零的“Content-length” header )以及它有多大。

请注意,您仍然需要让套接字成为非阻塞的,正如我上面在回答中提到的那样。

关于c++ - 使用 winsock,如何从 IE 接收 POST Http 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896302/

相关文章:

javascript - AJAX 状态 12030

c++ - ZeroMQ dealer--to-dealer 与 winsock 相比延迟高

c++ - 结构体、数组和函数 C++

java - HttpURLConnection 不响应也不抛出异常

c++ - 如何在带参数的函数上使用 boost::call_once()

javascript - 在 AngularJS 和 PHP 中允许 CORS

c++ - 如何从远程计算机获取当前登录的用户名

c++ - 成功接收后清空缓冲区

c++ - 如何识别从 iBrokers API 接收到的 HistoricalData 的类型(whatToShow)

c++ - 我可以让虚拟抽象类抛出异常吗