У меня есть сервер и клиентское приложение, в котором клиент отправляет на сервер кучу пакетов. Используемый протокол - UDP. Клиентское приложение порождает новый поток для циклической отправки пакетов. Серверное приложение также создает новый поток для ожидания пакетов в цикле.
Оба эти приложения должны обновлять пользовательский интерфейс по мере выполнения передачи. Вопрос о том, как правильно обновлять пользовательский интерфейс, был решен с помощью этот вопрос. По сути, и серверное, и клиентское приложения будут вызывать событие (код ниже) для каждой итерации цикла, и оба будут обновлять пользовательский интерфейс по мере выполнения. Что-то вроде этого:
private void EVENTHANDLER_UpdateTransferProgress(long transferedBytes) {
receivedBytesCount += transferedBytes;
packetCount++;
}
Таймер в каждом приложении будет обновлять пользовательский интерфейс с учетом последней информации от receivedBytesCount
и packetCount
.
У клиентского приложения вообще нет проблем, вроде все работает должным образом, а пользовательский интерфейс правильно обновляется каждый раз при отправке пакета. Сервер проблемный ...
Когда передача завершена, receivedBytesCount
и packetCount
не будут соответствовать ни общему размеру в отправленных байтах, ни количеству пакетов, отправленных клиентом. Кстати, каждый пакет имеет размер 512 байт. Серверное приложение считает пакеты, полученные сразу после возврата вызова от Socket.ReceiveFrom()
. И кажется, что по какой-то причине получает не все пакеты, которые надо.
Я знаю, что я использую UDP, который не гарантирует, что пакеты действительно прибудут в пункт назначения, и повторная передача не будет выполняться, поэтому может быть некоторая потеря пакетов. Но у меня вопрос: поскольку я фактически тестирую это локально, сервер / клиент находятся на одном компьютере, почему именно это происходит?
Если я помещаю Thread.Sleep(1)
(что, кажется, переводится как пауза в 15 мс) в цикл отправки клиента, сервер получит все пакеты. Поскольку я делаю это локально, клиент отправляет пакеты так быстро (без вызова Sleep()
), что сервер не успевает за ними. Это проблема или может быть где-то еще?
ReceiveBufferSize
большее значение, например 256 КБ (по умолчанию 8 КБ). - person L.B   schedule 10.04.2012ReceiveBufferSize
не изменит логику вашей программы. Вы можете продолжать отправлять или получать пакеты размером 512 байт. это опция UdpClient (или сокета) - person L.B   schedule 10.04.2012