Как улучшить этот код TCP? - PullRequest
1 голос
/ 01 июня 2011

Иногда recByte не может получить ответ, даже если сервер ответил, потому что сервер был недостаточно быстр. Который, если случилось, я использую

catch (System.IO.IOException ioe)

для предотвращения ошибки, но возможны ли альтернативы, позволяющие клиенту подождать немного дольше? Я попробовал

clientStream.ReadTimeout = 20000;

но это не сработало

TcpClient Client = new TcpClient();
Client.Connect(ipaddress, portnum);

NetworkStream clientStream = Client.GetStream();

byte[] buffer = themessagetosent;
clientStream.Write(buffer, 0, buffer.Length);

byte[] recByte = theresponse;
clientStream.Read(recByte, 0, recByte.Length);

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Вам нужно увеличить время ожидания для tcpClient, а не для потока.Также, возможно, вы захотите увеличить время ожидания как для send, так и для receive, и, вероятно, более чем на 2 секунды.

var client = new TcpClient { SendTimeout = 10000, ReceiveTimeout = 10000 };

Я думаю, что если вы посмотрите на внутреннее исключение в IOException, вы увидите SocketExceptionвнутри.Посмотрите на код ошибки, чтобы узнать, что именно происходит.

1 голос
/ 01 июня 2011

Если сервер отправляет очень мало байтов, вы можете рассмотреть возможность использования socket.NoDelay = false на стороне сервера (также на стороне клиента, если требуется), это отключит алгоритм Nagle и заставит стек tcp / ip немедленно отправлять данныебез поиска дополнительных данных для сбора.

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

0 голосов
/ 01 июня 2011

Проверьте использование CanRead и DataAvailable в этом примере на MSDN .

...