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

With winsock, how receive POST Http message from IE

本文关键字:接收 POST Http 消息 IE winsock 使用      更新时间:2023-10-16

我有一个C++应用程序,函数为receiveNetworkData(…)。这个函数对于下载互联网上的任何其他页面都非常有用。这架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");

所有套接字在创建时都是阻塞。这意味着从中读取等操作将阻塞,直到可以满足调用。

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

要使用winsock使套接字不阻塞,可以使用如下函数ioctlsocket

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

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

编辑

重读你的问题后,我发现问题是你不知道浏览器JavaScript的请求何时结束。来自维基百科关于HTTP协议的文章:

请求消息包括以下内容:

  • 请求行
  • 页眉
  • 空行
  • 可选的消息正文

请求行和标头都必须以结尾(即回车后接换行)。空行必须只包含空格,不能包含其他空格。

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

请注意,您仍然需要使套接字不阻塞,如上所述。