使用winsock,如何从IE接收POST Http消息
With winsock, how receive POST Http message from IE
我有一个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协议的文章:
请求消息包括以下内容:
- 请求行
- 页眉
- 空行
- 可选的消息正文
请求行和标头都必须以结尾(即回车后接换行)。空行必须只包含空格,不能包含其他空格。
你必须阅读,直到你得到完整的标题,即你收到一个空行。然后你还应该知道是否有一个消息正文要读(有一个非零的"内容长度"标题)以及它有多大
请注意,您仍然需要使套接字不阻塞,如上所述。
相关文章:
- 使用流处理接收到的数据
- 从udp接收帧对于人脸识别来说太慢
- 如何使用curlpp通过POST方法上传文件和json数据
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 使用libcurl提交批量url的正确BING Api POST url是什么
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- 接收字符串并使用它来调用方法C++
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 从 Python 接收C++字符串
- 接收和返回函数指针的函数指针的类型?
- 无法使用 g++ 从多个文件接收正确的输出
- 使用 winsock 接收 http 请求
- 如何在c++中使用libcurl发送POST请求并接收它
- 如何在C套接字程序中接收HTTPGET和POST请求
- 使用winsock,如何从IE接收POST Http消息
- 如何发送POST请求和接收GET响应