2014-09-09 3 views
0

Я отправляю XML-отформатированное сообщение на сервер с использованием TCP-сокета. Сервер отвечает полным сообщением (я проверил с WireShark), но у меня есть проблема с его завершением на моей стороне. Когда я использую буфер размером более 1 байт, ответ не имеет оставшегося размера буфера в конце сообщения. При использовании 1 байтового буфера он работает в 99% случаев. Я думаю, что это имеет какое-то отношение к StringBuilder, который я использую, но у меня уже нет идей. Я также пробовал NetworkStream и StreamSocket, но без везения. Любая помощь или ответ будут оценены.Неполный ответ с сервера при использовании буфера более 1 байт

public string StartClient(string message, string ip, int port) { 

    byte[] bytes = new byte[1]; 
    int bytesRec = 0; 
    StringBuilder reply = new StringBuilder(); 

    try { 
     IPAddress ipAddress = IPAddress.Parse(ip); 
     IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); 

     Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      sender.Connect(remoteEP); 

      byte[] msg = Encoding.ASCII.GetBytes(message); 

      sender.Send(msg); 

      do 
      { 
       bytesRec = sender.Receive(bytes); 

       if (bytesRec == 0) 
       { 
        sender.Shutdown(SocketShutdown.Both); 
        sender.Close(); 
        break; 
       } 

       else 
       { 
        reply.Append(Encoding.ASCII.GetString(bytes, 0, bytesRec)); 
       } 
      } while (sender.Available > 0); 
     } 

    catch (Exception e) 
    { 
     return e.ToString(); 
    } 

    return reply.ToString(); ; 
} 

ответ

0

Попробуйте изменить строку:

while (sender.Available > 0) 

к:

while (bytesRec > 0) 
+0

Теперь зависание приложения, и это выглядит как цикл не заканчивается. –

+0

OK - Он работает для меня - но это не оптимальный способ убедиться, что вы все прочитали из сети. Если вы управляете сервером, вы можете использовать первые 4 байта в сообщении, чтобы указать общую длину сообщения. Затем вы будете продолжать читать, пока не прочтете общую длину. – user1492780

+0

Я сделал несколько тестов, и он работает, как вы говорите, когда я устанавливаю 'Socket.ReceiveTimeout' ~ 1000 мс и устанавливаю буффер на размер самого большого полученного пакета, в моем случае это 1514 байт. Я предполагаю, что сервер не отправляет данные вовремя, а иногда 'Socket.Receive()' получает '0' в середине соединения, что приводит к завершению цикла. В любом случае, спасибо за идею! –

 Смежные вопросы

  • Нет связанных вопросов^_^