你怎么知道何时向Web服务器发出POST或GET的Winsock控件收到了所有数据?

时间:2010-06-22 04:18:59

标签: vb6 tcp winsock

我正在使用VB6 Winsock控件。当我对服务器进行POST时,我会将响应作为多个数据到达事件返回。

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

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

3 个答案:

答案 0 :(得分:1)

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

示例:每封邮件以“[”开头,以“]”结尾。

“[留言文字]”

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

答案 1 :(得分:1)

在HTTP中,您必须解析并分析服务器发回给您的回复数据,以便了解如何全部阅读。

首先,服务器发回一个CRLF分隔的标题行列表,这些标题行由空白的CRLF分隔的行自行终止。然后,您必须查看“Content-Length”和“Transfer-Encoding”标头的实际值,以了解如何读取剩余数据。

如果没有'Transfer-Encoding'标头,或者它没有包含'chunked'项,那么'Content-Length'标头指定要读取的剩余字节数。但是如果'Transfer-Encoding'标题包含'chunked'项,那么你必须一次一个地读取和解析剩余数据,以便知道数据何时结束(每个块报告自己的大小,并且最后一个块报告大小为0)。

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

阅读RFC 2616了解详情。

答案 2 :(得分:0)

不,当所有数据都已到达时,Close事件不会触发,当您关闭连接时它会触发。知道何时传输了所有数据并不是Winsock控件的工作,这是你的。作为客户端/服务器通信协议实现的一部分,您必须告诉客户端期望的内容。

假设您的客户端需要来自服务器的文件内容。客户端不知道文件中有多少数据。交流可能会是这样的:

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

理想情况下,服务器也会对数据附加校验和,您必须实现某种超时机制,如果没有获得预期的数据量,请弄清楚要做什么,等等。 / p>