【问题标题】:Regarding Callback method used for BeginReceive method关于用于 BeginReceive 方法的回调方法
【发布时间】:2012-08-03 12:56:23
【问题描述】:

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

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

如果有人能澄清我的疑问,我将不胜感激。

【问题讨论】:

    标签: vb.net sockets asyncsocket beginreceive


    【解决方案1】:

    来自MSDN(强调我的):

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

    您有一个流式套接字,因此这是断开连接的信号。我怀疑这恰好允许对BeginReceive 的每个调用与对EndReceive 的调用相匹配。

    【讨论】:

    • 非常感谢吉迪恩。因此,当在我的回调方法(用于数据接收)中收到 0 个字节时,我可以安全地假设主机已断开连接,我可以关闭自己的客户端套接字。这解决了我的很多疑惑。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2016-11-06
    • 2013-04-23
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多