0

以下は、サーバーからのデータの非同期受信のためにクライアント側でソケットプログラミングで使用するコールバックメソッドです:-

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 になるということです。ただし、接続時ではなく、ソケットに対して読み取るデータがある場合にのみ呼び出す必要があります。 /切断が発生しますよね?

私の疑問を明確にしてくれる人に本当に感謝します。

4

1 に答える 1

0

MSDNから(強調鉱山):

リモート ホストが Shutdown メソッドを使用して Socket 接続をシャットダウンし、利用可能なすべてのデータを受信した場合、EndReceive メソッドはすぐに完了し、ゼロ バイトを返します

ストリーミング ソケットがあるため、これは切断を通知しています。これにより、 への各呼び出しが へBeginReceiveの呼び出しと一致するようになるのではないかと思いEndReceiveます。

于 2012-08-03T13:15:22.727 に答える