Tcp 从套接字读取其后面的数据';关门了

Tcp 从套接字读取其后面的数据';关门了,tcp,vb6,winsock,Tcp,Vb6,Winsock,使用VisualBasic6.0,我创建了一个到Web服务器的WinsockHTTP连接,该连接发送数据并立即关闭。(连接:保持活动状态,对此服务器没有任何好处) 这是我的一段代码: sck.SendData "GET /? HTTP/1.1" & vbNewLine & _ "Host: example.org" & vbNewLine & _ "Connection: keep-alive" & vb

使用VisualBasic6.0,我创建了一个到Web服务器的WinsockHTTP连接,该连接发送数据并立即关闭。(连接:保持活动状态,对此服务器没有任何好处)

这是我的一段代码:

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
sck.SendData“GET/?HTTP/1.1”&vbNewLine&_
“Host:example.org”&vbNewLine&_
“连接:保持活动状态”&vbNewLine&vbNewLine
“//等待完整数据:
将数据设置为字符串
而(不是isEOF(数据))和sck.State=sckConnected
如果sck.State=sck已连接,则sck.PeekData数据
睡眠10:10
温德
如果sck.状态sck已连接,则
“//当该命令触发时,我的数据丢失了其余数据的25%。
“//根据Wireshark正确接收,但Winsock
“//在获取数据变量的其余部分之前关闭套接字。
MsgBox“这在10%的时间里是随机发生的。”vbInformation
如果结束
剪贴板,清除
Clipboard.SetText数据
Msgbox数据
sck.关闭
函数的作用是检查数据是否已满并准备就绪(读取内容长度、标记或空字符)。 没必要把它贴在这里,因为它很大,也不是问题,相信我

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

这里的要点是,10%的时候,Winsock会在我获取其余数据之前关闭套接字。 我尝试了一切方法来解决这个问题(使用事件处理程序、GetData而不是PeekData等),但我仍然随机地在连接到的web服务器上遇到相同的错误

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

你能试试下面的代码吗

'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
'1带有以下内容的表单:
'1 winsock控件:名称=Winsock1
'1命令按钮:name=Command1
选项显式
专用子命令1_Click()
使用Winsock1
。连接“”,
做
多芬特
循环直到.State=sckConnected
.SendData
以“Winsock1”结尾
端接头
私有子Winsock1_数据到达(ByVal ByTestTotal长度)
将strData设置为字符串
Winsock1.GetData标准数据
ProcessData标准数据
端接头
私有子进程数据(strData作为字符串)
静态字符串
STROTOTAL=STROTOTAL和strData
如果是完整的(strTotal),则检查数据是否完整
Winsock1。关闭
如果结束
端接头
我只运行了几次,在检索大块数据时从未丢失任何数据(在数据完成之前覆盖了几个dataarrival事件)


另外,请确保在ProcessData过程中的某个地方执行其他操作,当然,在执行操作后清空strTotal:)

您的问题显示出一些误解

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

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


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

    套用欧比万的话:“使用事件,卢克!这不是你要找的QBasic。”什么是IsComplete()函数?IsComplete()函数检查是否已收到所有数据。在当时的项目中,我检查了数据是否由vbCR字符关闭,但您的数据可能需要另一次检查才能完成。在最初的问题中,发帖人出于同样的目的使用了自己的isEOF()函数