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

时间:2011-12-24 19:23:32

标签: vb6 winsock

我正在使用Winsock控件:

Private Sub Form_Load()
  Winsock1.Connect "stackoverflow.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: stackoverflow.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

如果标题不包含Content-Length,我怎么知道控件已完成接收文件?

我听说过某些方法,例如Winsock1.state 0时它意味着连接已关闭,但有时会保持其他状态,例如7,所以我需要另一种解决方案。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

HTTP传输使用Content-Length标头来确定数据的长度。如果标头丢失,则数据结束将通过连接关闭发出信号。