关于用于BeginReceive方法的回调方法

时间:2012-08-03 12:56:23

标签: vb.net sockets asyncsocket beginreceive

以下是我在客户端的套接字编程中使用的回调方法,用于从服务器异步接收数据: -

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.但只有在为套接字读取一些数据时才应调用它,不是在发生连接/断开时,对吗?

我真的很感激任何澄清我怀疑的人。

1 个答案:

答案 0 :(得分:0)

来自MSDN(强调我的):

  

如果远程主机使用Shutdown关闭Socket连接   方法,并且已收到所有可用数据, EndReceive   方法将立即完成并返回零字节

你有一个流式套接字,所以这是一个断开连接的信号。我怀疑这种情况恰好允许每个BeginReceive来电与EndReceive的来电相匹配。