关闭后从套接字读取数据
Posted
技术标签:
【中文标题】关闭后从套接字读取数据【英文标题】:Reading data from socket after it's closed 【发布时间】:2012-11-28 06:41:40 【问题描述】:使用 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() 函数会检查数据是否已满并准备就绪(读取内容长度、
【参考方案1】:你能试试下面的代码吗?
'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 :)
【讨论】:
什么是 IsComplete() 函数? IsComplete() 函数检查是否已收到所有数据。在我当时的项目中,我检查了数据是否被 vbCR 字符关闭,但您的数据可能需要再次检查才能完成。在最初的问题中,发帖人使用他自己的 isEOF() 函数来达到同样的目的【参考方案2】:您的问题存在一些误解。
Winsock 从不 关闭套接字,除非您 关闭它。如果您遇到关闭的套接字,您将其关闭。
如果 peer 关闭 his 套接字,则构成 连接的关闭。 但是,peer 已排队等待的所有数据send 仍然会被发送,并且您仍然会收到它,在收到 VB 中的任何 EOS 指示之前。然后您将收到 EOS,您应该关闭您的套接字。
【讨论】:
【参考方案3】:关闭一侧的socket,然后从另一侧调用recv并检查返回值。
【讨论】:
以上是关于关闭后从套接字读取数据的主要内容,如果未能解决你的问题,请参考以下文章
Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
Apache 不会在新的 Xampp 安装上启动:管道已结束。孩子:无法从父母那里读取套接字数据
Zebra 打印机连接失败“读取失败,套接字可能关闭或超时,读取 ret:-1”
蓝牙连接错误:“jnius.jnius.JavaException:发生 JVM 异常:读取失败,套接字可能关闭或超时,读取 ret:-1”