Я отправляю 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(); ;
}
Теперь зависание приложения, и это выглядит как цикл не заканчивается. –
OK - Он работает для меня - но это не оптимальный способ убедиться, что вы все прочитали из сети. Если вы управляете сервером, вы можете использовать первые 4 байта в сообщении, чтобы указать общую длину сообщения. Затем вы будете продолжать читать, пока не прочтете общую длину. – user1492780
Я сделал несколько тестов, и он работает, как вы говорите, когда я устанавливаю 'Socket.ReceiveTimeout' ~ 1000 мс и устанавливаю буффер на размер самого большого полученного пакета, в моем случае это 1514 байт. Я предполагаю, что сервер не отправляет данные вовремя, а иногда 'Socket.Receive()' получает '0' в середине соединения, что приводит к завершению цикла. В любом случае, спасибо за идею! –