Что такое хороший размер буфера для программирования сокета?

Мы используем .NET и сокеты. Сервер использует Socket.Sender(bytes[]) метод, таким образом, это просто отправляет всю полезную нагрузку. С другой стороны мы - клиенты, использующие данные. Socket.Receive(buffer[]). Во всех примерах от Microsoft (и другие) они, кажется, придерживаются размера буфера 8 192. Мы использовали этот размер, но время от времени мы отправляем данные вниз клиентам, который превышает этот размер буфера.

Существует ли способ определить, сколько данных отправленный метод сервера отправил нас? Каков лучший размер буфера?

31
задан Ondrej Slinták 8 November 2019 в 10:17
поделиться

3 ответа

Даже если вы отправляете больше данных, чем это, они могут быть недоступны за один звонок для получения.

Вы не можете определить, сколько данных отправил сервер - это поток данных, и вы просто читаете куски за раз. Вы можете прочитать часть того, что сервер отправил в одном вызове Send, или вы можете прочитать данные из двух Send calls in one Receive call. 8K - это разумный размер буфера - не настолько большой, чтобы вы тратили много памяти, и не настолько маленький, чтобы вам пришлось использовать множество потраченных впустую звонков Receive. 4K или 16K, вполне возможно, тоже были бы в порядке... Лично я бы не стал превышать 16K для сетевых буферов - я подозреваю, что вы редко их заполняете.

Вы можете поэкспериментировать, пытаясь использовать очень большой буфер и регистрировать, сколько байт было получено в каждом вызове - это даст вам некоторое представление о том, сколько обычно доступно -но на самом деле это не покажет эффект от использования меньшего буфера. Какие у вас проблемы с использованием буфера 8K? Если это производительность, есть ли у вас какие-либо доказательства того, что этот аспект вашего кода является узким местом производительности?

40
ответ дан 27 November 2019 в 21:59
поделиться

8192 было бы идеально. Если у вас есть данные, которые превышают этот размер, было бы лучше отправлять данные пакетами постоянной длины.

Размер данных, отправляемых сервером, можно проверить с помощью функции recv в WINSOCK, которая имеет параметр, указывающий длину буфера.

0
ответ дан 27 November 2019 в 21:59
поделиться

Это зависит от вашего протокола. Если вы ожидаете сообщения размером более 8192 байт, то вам следует соответственно увеличить размер буфера. Но имейте в виду, что этот размер буфера рассчитан только на один вызов Receive. Если вы действительно хотите или нуждаетесь в этом, вы можете выполнить цикл Receive несколько раз и скопировать полученные данные в произвольно большую структуру данных или буфер.

Также помните, что хорошей практикой является многократный вызов Receive, пока вы не убедитесь, что прочитали все данные для данного сообщения; даже если размер одного сообщения меньше размера вашего буфера, оно все равно не может быть получено одним вызовом Receive.

9
ответ дан 27 November 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: