如何知道一个winsock已经完成接收文件?

Posted

技术标签:

【中文标题】如何知道一个winsock已经完成接收文件?【英文标题】:How to know a winsock has completed receiving file? 【发布时间】:2011-12-24 19:23:32 【问题描述】:

我正在使用Winsock 控件:

Private Sub Form_Load()
  Winsock1.Connect "***.com", 80
End Sub

Private Sub Winsock1_Close()
  Winsock1.Close
End Sub

Private Sub Winsock1_Connect()
  Winsock1.SendData "GET /questions/8624871/vb6-alternative-to-inet-webbrowser-control HTTP/1.1" & vbCrLf & "Host: ***.com" & vbCrLf & vbCrLf
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim s As String

  Winsock1.GetData s, vbString
  RichTextBox1.Text = RichTextBox1.Text & s
End Sub

header中不包含Content-Length怎么知道控件已经接收完文件?

我听说过一些方法,比如Winsock1.state0 时表示连接已关闭,但有时它仍处于其他状态,如7,所以我需要另一种解决方案。

【问题讨论】:

【参考方案1】:

您需要解析收到的 HTTP 标头。 RFC 2616 Section 4.4 解释了它们如何告诉您数据的长度以及需要如何读取数据。

【讨论】:

【参考方案2】:

您可以在 VB6 中使用许多组件来发出 HTTP 请求。有些带有 VB6,有些现在是 Windows 的一部分。其中大多数都比使用 Winsock 控件在 TCP 之上滚动您自己的 HTTP 好得多。标头处理只是他们可以帮助您完成的事情之一。

【讨论】:

【参考方案3】:

如果您仍想推出自己的 HTTP 客户端,则应阅读 HTTP 规范而不是猜测。

HTTP 传输使用 Content-Length 标头来确定数据的长度。如果缺少标头,则连接关闭表示数据结束。

【讨论】:

以上是关于如何知道一个winsock已经完成接收文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用winsock或wininet下载文件[关闭]

WinSock 异步I/O模型-4

Winsock - 10038 错误 - Win2K3 服务器 - 令人费解的行为

WinSock中如何清除接收缓冲区

如何在 Winsock 中查找当前使用的 UDP 接收缓冲区大小

用winsock发送位图