Подтвердить что ты не робот

С# получить максимальное значение для Socket.ReceiveBufferSize и Socket.SendBufferSize в системе

Наше высокопроизводительное приложение (~ 1 гбит/с) значительно выигрывает от большого размера ReceiveBufferSize и SendBufferSize.

Я заметил, что на моей машине я могу иметь размер буфера 100 МБ без проблем, но на некоторых клиентских и тестовых машинах максимальное значение немного меньше 10 МБ и кажется переменным.

Существуют ли какие-либо методы для запроса системы, каков размер буфера max tx/rx.

4b9b3361

Ответ 1

На самом деле для высокопроизводительных сетей параметры SO_RCVBUF и SO_SNDBUF должны быть установлены в 0 для избежания буферных копий, согласно KB181611:

Если вы используете SO_RCVBUF и SO_SNDBUF возможность установить нулевой стек стека TCP и отправьте буфер, вы в основном проинструктировать стек TCP напрямую выполнять ввод-вывод с использованием предоставленного буфера в вашем вызове ввода/вывода. Поэтому в дополнение к неблокируемому преимуществу ввода-вывода с перекрывающимся разъемом, другое преимущество улучшенная производительность потому что вы сохраняете копию буфера между буфер стека TCP и пользователь буфер для каждого вызова ввода/вывода. Но у тебя есть чтобы убедиться, что вы не имеете доступа к пользователю буфера после его подачи операции перекрытия и до завершена операция перекрытия.

Максимальные значения, которые вы можете установить для этих параметров (которые являются реальным параметром за управляемым Socket.ReceiveBufferSize), зависят от реализации. Другие параметры TCP задокументированы в настройках реестра TCP/IP.

Ответ 2

Эти два свойства внутренне играют с параметрами сокета (через SetSocketOption, в конце концов к родному setsockopt). Если память обслуживается, они зависят от недоступной памяти пула (которая изменяет машину на машину) и потенциально, какой сетевой драйвер находится на каждой машине.

Независимо от того, что вы фактически не гарантируете, что размер буфера, который вы запросили, используется, вам нужно будет получить текущий размер буфера после факта, чтобы убедиться, что он был использован. Более того, на машинах Windows 7 и 2008 я понимаю, что ваши буферы могут динамически увеличиваться/уменьшаться.

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