Vb6 如何知道向Web服务器发出POST或GET的Winsock控件何时接收到所有数据?

Vb6 如何知道向Web服务器发出POST或GET的Winsock控件何时接收到所有数据?,vb6,tcp,winsock,Vb6,Tcp,Winsock,我正在使用VB6 Winsock控件。当我向服务器发送帖子时,我会将响应作为多个数据到达事件返回 您如何知道所有数据何时到达 (我猜是Winsock_Close事件触发的时候)我过去使用过VB6 Winsock控件,我所做的是以某种方式格式化消息,以了解所有数据何时到达 示例:每条消息以“[”开头,以“]”结尾 “[消息文本]” 当数据从DataArrival事件传入时,请检查消息“]”的结尾。如果在那里,您至少收到了一条完整的消息,并且可能是新消息的开始。如果有更多消息正在等待,请将消息数据存

我正在使用VB6 Winsock控件。当我向服务器发送帖子时,我会将响应作为多个数据到达事件返回

您如何知道所有数据何时到达


(我猜是Winsock_Close事件触发的时候)

我过去使用过VB6 Winsock控件,我所做的是以某种方式格式化消息,以了解所有数据何时到达

示例:每条消息以“[”开头,以“]”结尾

“[消息文本]”


当数据从DataArrival事件传入时,请检查消息“]”的结尾。如果在那里,您至少收到了一条完整的消息,并且可能是新消息的开始。如果有更多消息正在等待,请将消息数据存储在表单级变量中,并在下次触发DataArrival事件时追加到该变量。

否,关闭事件不会在所有数据到达时触发,而是在关闭连接时触发。知道所有数据何时传输不是Winsock控件的工作,而是您的工作。作为客户机/服务器通信协议实现的一部分,您必须告诉客户机预期的结果

假设您的客户机希望从服务器获取文件内容。客户端不知道文件中有多少数据。交换可能是这样的:

  • 客户端发送文件中数据的请求
  • 服务器读取文件,确定大小,将大小附加到数据的开头(假设它使用4个字节),告诉客户端需要多少数据,然后开始发送
  • 客户机代码知道从文件请求后到达的任何数据中去掉前4个字节,并将其存储为后续的数据量,然后通过任意数量的DataArrival事件累积后续数据,直到达到该数据量为止

理想情况下,服务器也会向数据附加校验和,您必须实现某种超时机制,找出如果无法获得预期的数据量时该怎么办,等等。

在HTTP中,您必须解析和分析服务器发送回您的回复数据,以便知道如何读取所有数据

首先,服务器发回一个CRLF分隔的标题行列表,这些标题行由一个空白的CRLF分隔行自行终止。然后,您必须查看“内容长度”和“传输编码”标题的实际值,以了解如何读取其余数据

如果没有“传输编码”头,或者其中不包含“分块”项,则“内容长度”头指定要读取的剩余字节数。但是,如果“传输编码”头包含一个“分块”项,那么您必须读取和解析分块的剩余数据,一次一个,以便知道数据何时结束(每个分块报告其自身大小,最后一个分块报告大小为0)

不,除非“connection”标题明确表示“close”,否则您不能依赖于在发送回复后关闭连接。对于HTTP 1.1,该头通常设置为“保持活动”,这意味着套接字保持打开状态,以便客户端可以在同一套接字上发送更多请求

阅读更多细节