Проблемы передачи данных с использованием сетевого потока

У меня есть большая проблема с моим кодом. Или с системой. Вот код клиента в C#:

TcpClient client = new TcpClient("192.168.1.254", 19999);
NetworkStream nstream = client.GetStream();
Console.WriteLine("Connected.");
Stream stream = new FileStream("test.dat", FileMode.Create, FileAccess.Write);
int counter = 0;
byte[] buffer = new byte[1024];
while ((counter = nstream.Read(buffer, 0, 1024)) > 0)
{
    stream.Write(buffer, 0, counter);
}
stream.Close();
nstream.Close();
client.Close();
Console.WriteLine("Done here.");

Это приложение работает с сервером, написанным на Python. Здесь нет ракетостроения. Клиент подключается, сервер немедленно отправляет данные в цикле до конца и сокет закрывается. Проблема в том, что на моей машине это приложение всегда перестает получать данные после 5 - 7 кБ. Он останавливается и (как показывает отладчик) зависает при методе чтения. Это происходит только на моей машине (Windows 7 x64 от MSDN, Visual Studio 2013 Express, .net 4.5.1). Протестировал это приложение также на моей машине, но на Linux, с моно и на некоторых других машинах Windows. Везде это работает, но, к сожалению, не здесь. Я думаю, что это проблема с моей системой, поэтому вот что я попробовал до сих пор:

  • запущенное приложение без отладчика

  • переустановка визуальной студии

  • переустановка.NET Framework

  • отключение брандмауэра Windows и AV

  • изменение целевой структуры на предыдущие версии (3, 3.5)

К сожалению, переустановка ОС невозможна. Я должен заставить это работать в моей системе, но у меня заканчиваются варианты. Я даже не знаю, что вызывает эту проблему. Что еще я могу проверить?

1 ответ

Решение

NetworkStream.Read Метод, вызываемый без доступных байтов, будет блокироваться до тех пор, пока не станут доступны байты или пока соединение не будет закрыто. Таким образом, вам может быть лучше: 1) разработать протокол, в котором вы знаете, сколько байтов поступает заранее, затем прекратить чтение, когда вы прочитали такое количество байтов, или 2) закрыть соединение после истечения времени бездействия. Обратите внимание, что 1) это единственный способ правильно закодировать это, 2) даст вам частичные данные, если произойдет сбой в сети.

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