2013-08-27 7 views
-1

Я использую example of Microsoft (Visual Basic нетто 4,5) для отправки и получения Datas бросить гнездо, но этот блок всегда верно:EndReceive никогда никогда не заканчивает прием VB Net

Private Sub OnRecieve(ByVal ar As IAsyncResult) 
    Try 
     Dim state As StateObject = CType(ar.AsyncState, StateObject) 
     Dim client As Socket = state.workSocket 

     ' Read data from the remote device. 
     Dim bytesRead As Integer = client.EndReceive(ar) 

     If bytesRead > 0 Then 
      ' There might be more data, so store the data received so far. 
      state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)) 

      ' Se supone que vuelve por los datos que faltan, pero no lo hace (Creo) 
      client.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state) 

     Else 
      ' All the data has arrived; put it in response. 
      If state.sb.Length > 1 Then 
       VariablesGlobales.response = state.sb.ToString() 
      End If 
      ' Signal that all bytes have been received. 
      receiveDone.Set() 
     End If 


    Catch ex As Exception 
     'clientSocket.Close() 
     RaiseEvent FallaAlRecibirDatos(ex.Message, "Falla en endReive.") 
    End Try 

End Sub 

Но я пошлю и отправить , и отправить сообщение, короткое или большое, и оно никогда не вводится в предложение else. Вот мой исходный код:

Public Sub Conectar() 

    clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) 

    Dim ipEndPoint As IPEndPoint = New IPEndPoint(Me.ipAddress, VariablesGlobales.Puerto) 
    clientSocket.BeginConnect(ipEndPoint, New AsyncCallback(AddressOf OnConnect), clientSocket) 

    ' Wait for connect. 
    connectDone.WaitOne() 

    EnviarDatosPersonales() 

    ' Wait for send datas. 
    sendDone.WaitOne() 

    While True 
     AvtivarEscuchador() 
     receiveDone.WaitOne() 

     DescifrarMsg(VariablesGlobales.response) 
    End While 
End Sub 

я Получать сообщения, отправляемые сервером, и я могу видеть их в визуальные шаги студии к шагам, но я не знаю, почему он никогда не входит в другой, я означает, что он никогда не заканчивает получение данных.

Я читал the answer of Marc Gravell, но я предпочитаю пример кода, как решить это, я не знал, что делать.

Кроме того, я удалил «else», и он заполнил мой textBox множеством белых линий, подобно тому, как поступает бесконечная петля. Пожалуйста, помогите мне. Благодарю.

О К сожалению, здесь Escuchador Функция:

Private Sub AvtivarEscuchador() 

    ' Borramos los datos de respuesta anterior 
    VariablesGlobales.response = "" 

    ' Activamos el escuchador 
    Try 
     ' Create the state object. 
     Dim state As New StateObject() 
     state.workSocket = Me.clientSocket 

     ' Begin receiving the data from the remote device. 
     Me.clientSocket.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state) 
    Catch e As Exception 
     RaiseEvent FallaAlRecibirDatos("No se pudo activar el escuchador.", "Falla al intentar escuchar.") 
    End Try 

End Sub 
+0

вы вызываются 'client.BeginReceive' хотя бы один раз? что такое начальное значение 'bytesRead'? – I4V

+0

Я редактировал вопрос с большим количеством кода. – bluesky777

+0

bluesky777, я до сих пор не вижу, что вы называете 'BeginReceive'. Как вы думаете, 'OnRecieve' вызывается, когда вы не вызываете' BeginRecv' – I4V

ответ

0

Как вы уже ссылку на ответ Марка Gravell, его первое предложение в важный:

«EndReceive вполне может получить 0 если поток закрыт, и все данные были уничтожены. "

Пока поток открыт, вы никогда не получите 0 от EndReceive. Вы должны обработать данные, которые у вас есть в соответствии с вашим протоколом, чтобы найти конец вашего сообщения и отправить ответ.

И как вы просили некоторый код, вот ваш код с комментариями, где поставить дополнительные части:

If bytesRead > 0 Then 
    ' There might be more data, so store the data received so far. 
    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)) 

    ' Put here code to check for protocol end (for example \0) in your buffer state.sb 
    ' and handle protocol if found. The rest of the buffer should remain in the buffer 
    ' as it could be part of the next protocol. 

    ' if you only except one message, set receiveDone.Set() here if message received 
    ' completely 

    ' Se supone que vuelve por los datos que faltan, pero no lo hace (Creo) 
    client.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state) 

Else 
    'connection was closed 
    ' handle existing information if appropreate 
    receiveDone.Set() 
End If 
+0

Спасибо, но это не показано в примере Microsoft. Как вы можете видеть, я вызываю функцию DescifrarMsg (VariablesGlobales.response) для обработки данных и вставки ответа в текстовый блок чата. Мне нужно закрыть Socket, чтобы закончить прием данных и снова открыть, чтобы продолжить прослушивание ?. PD: Почему у моего вопроса есть -1 ?? : O – bluesky777

+0

Обновить ответ с помощью «кода». Вам не нужно закрывать сокет, просто обрабатывать все полученные вами данные и выбирать протокол таким образом, чтобы у вас была конечная информация (например, «\ 0»). –

+0

Спасибо. Я использовал это: **If** state.sb.ToString.Contains("\0") Then **Dim** textoMsg As String = state.sb.ToString **textoMsg** = textoMsg.Substring(0, textoMsg.LastIndexOf("\0")) **DescifrarMsg(textoMsg)** Return End If И он работает, я могу продолжить сейчас, большое вам спасибо. будь счастлив :) – bluesky777