关闭后从套接字读取数据

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 数量可能有误

unlink() 后从 FIFO 读取

Apache 不会在新的 Xampp 安装上启动:管道已结束。孩子:无法从父母那里读取套接字数据

Zebra 打印机连接失败“读取失败,套接字可能关闭或超时,读取 ret:-1”

蓝牙连接错误:“jnius.jnius.JavaException:发生 JVM 异常:读取失败,套接字可能关闭或超时,读取 ret:-1”

Python套接字服务器读取客户端的多命令[关闭]