关闭后从套接字读取数据

时间:2012-11-28 06:41:41

标签: tcp vb6 winsock

使用Visual Basic 6.0,我正在建立一个与Web服务器的Winsock HTTP连接,它会发送数据并在之后关闭。 (连接:keep-alive,对这个服务器没有任何好处)

这是我的一段代码:

sck.SendData "GET /? HTTP/1.1" & vbNewLine & _
             "Host: example.org" & vbNewLine & _
             "Connection: keep-alive" & vbNewLine & vbNewLine


'// Wait for full Data:
Dim DATA As String
While (Not isEOF(DATA)) And sck.State = sckConnected
    If sck.State = sckConnected Then sck.PeekData DATA
    Sleep 10: DoEvents
Wend

If sck.State <> sckConnected Then
    '// When this Fires, my data is missing the 25% of it's rest.
    '// It is received corectly acording to Wireshark, but Winsock
    '// closes the socket befor I can get the rest to the DATA variable.
    MsgBox "This happends randomly 10% of the times.", vbInformation
End If

Clipboard.Clear
Clipboard.SetText DATA
Msgbox DATA
sck.Close

isEOF()函数执行一些检查,查看数据是否已满并准备好(读取内容长度,&lt; / html&gt;标记或空字符)。 不需要在这里发布,因为它很大而且不是问题,相信我。

当您对已关闭的套接字使用:sck.GetDatasck.PeekData时,会出现错误。那么如何在套接字关闭后从套接字中获取数据呢?

这里的重点是10%的时间,Winsock关闭套接字,因为我可以获得其余的DATA。 我尝试了一切来解决问题(使用事件处理程序,GetData而不是PeekData等),但我仍然会随机连接到与我连接的Web服务器相同的错误。

使用Winsock进行核心GET和等待数据的正确方法是什么? 我在这段代码中做错了什么?

3 个答案:

答案 0 :(得分:0)

你可以试试下面的代码吗?

'1 form with :
'    1 winsock control : name=Winsock1
'    1 command button  : name=Command1
Option Explicit

Private Sub Command1_Click()
  With Winsock1
    .Connect "<your server>", <your port>
    Do
      DoEvents
    Loop Until .State = sckConnected
    .SendData <your command>
  End With 'Winsock1
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim strData As String
  Winsock1.GetData strData
  ProcessData strData
End Sub

Private Sub ProcessData(strData As String)
  Static strTotal As String
  strTotal = strTotal & strData
  If IsComplete(strTotal) Then 'your check to see if data is complete
    Winsock1.Close
  End If
End Sub

我刚刚运行了几次,并且在检索大块数据(在数据完成之前覆盖几个数据事件事件)时从未错过任何数据

还要确保在ProcessData过程中的某个地方做你的其他事情,当然在做完你的事后还要清空strTotal:)

答案 1 :(得分:0)

您的问题存在一些误解。

  1. Winsock 从不关闭套接字,除非关闭它。如果您遇到已关闭的套接字,将其关闭。

  2. 如果 peer 关闭他的套接字,则构成连接的关闭。但是对等方已排队的所有数据发送仍然会被发送,你仍然会收到它,之前接收到VB中的EOS指示。然后,您将收到EOS,应关闭套接字。

答案 2 :(得分:0)

一侧关闭套接字,然后从另一侧调用recv并检查返回值。