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