使用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.GetData
或sck.PeekData
时,会出现错误。那么如何在套接字关闭后从套接字中获取数据呢?
这里的重点是10%的时间,Winsock关闭套接字,因为我可以获得其余的DATA。 我尝试了一切来解决问题(使用事件处理程序,GetData而不是PeekData等),但我仍然会随机连接到与我连接的Web服务器相同的错误。
使用Winsock进行核心GET和等待数据的正确方法是什么? 我在这段代码中做错了什么?
答案 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)
您的问题存在一些误解。
Winsock 从不关闭套接字,除非你关闭它。如果您遇到已关闭的套接字,您将其关闭。
如果 peer 关闭他的套接字,则构成连接的关闭。但是对等方已排队的所有数据发送仍然会被发送,你仍然会收到它,之前接收到VB中的EOS指示。然后,您将收到EOS,您应关闭套接字。
答案 2 :(得分:0)
一侧关闭套接字,然后从另一侧调用recv并检查返回值。