Относительно метода обратного вызова, используемого для метода 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 ответ

Из MSDN (акцент мой):

Если удаленный хост завершает соединение Socket методом Shutdown, и все доступные данные были получены, метод EndReceive завершится немедленно и вернет ноль байтов.

У вас есть потоковый сокет, так что это сигнализирует об отключении. Я подозреваю, что это случается, чтобы каждый звонок BeginReceive быть сопоставленным с призывом к EndReceive,

Другие вопросы по тегам