以下是我在客户端的套接字编程中使用的回调方法,用于从服务器异步接收数据: -
Public Sub Connect()
m_clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
m_clientSocket.Connect(Ip, PortNo)
If (m_clientSocket.Connected) Then
m_clientSocket.BeginReceive(dataBuffer, 0,dataBuffer.Length SocketFlags.None, New AsyncCallback(AddressOf OnDataReceived), m_clientSocket) //here I connect the callback OnDataRecieved
End If
End Sub
Public Sub OnDataRecieved(ByVal async As IAsyncResult)
Dim Recieved_Size As Integer = m_clientSocket.EndReceive(async)
' rest of the code ...
End Sub
我怀疑当在“OnDataReceived方法”“Received_Size”= 0时,我应该断定套接字已断开连接吗?如果没有,那么在什么情况下Received_Size应该= 0?
为什么我要问的是,无论何时连接的服务器断开连接,都会调用“OnDataReceived”方法,结果“Received_Size”为= 0.但只有在为套接字读取一些数据时才应调用它,不是在发生连接/断开时,对吗?
我真的很感激任何澄清我怀疑的人。
答案 0 :(得分:0)
来自MSDN(强调我的):
如果远程主机使用Shutdown关闭Socket连接 方法,并且已收到所有可用数据, EndReceive 方法将立即完成并返回零字节。
你有一个流式套接字,所以这是一个断开连接的信号。我怀疑这种情况恰好允许每个BeginReceive
来电与EndReceive
的来电相匹配。