0

使用 Visual Basic 6.0,我正在建立一个到 Web 服务器的 Winsock HTTP 连接,该连接发送数据并在之后立即关闭。(连接:保持活动,对此服务器没有任何好处)

这是我的一段代码:

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() 函数会检查数据是否已满且准备就绪(读取内容长度、< /html> 标记或空字符)。不需要在这里发布,因为它很大而且不是问题,相信我。

当你使用:sck.GetDatasck.PeekData一个已关闭的套接字时,你会得到一个错误。那么如何在套接字关闭后从套接字获取数据?

这里的重点是 10% 的时间,Winsock 会在我获得其余数据之前关闭套接字。我尝试了一切来解决这个问题(使用事件处理程序、GetData 而不是 PeekData 等),但我仍然随机收到与我正在连接的网络服务器相同的错误。

使用 Winsock 正确获取并等待数据的正确方法是什么?我在这段代码中做错了什么?

4

3 回答 3

0

您的问题表现出几个误解。

  1. Winsock永远不会关闭套接字,除非关闭它。如果遇到关闭的套接字,则将其关闭。

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

于 2012-11-28T09:59:44.897 回答
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 :)

于 2012-11-28T07:33:46.550 回答
0

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

于 2020-06-22T17:21:34.593 回答