Что значит очистить сокет? - PullRequest
23 голосов
/ 27 мая 2009

Я не особо разбираюсь в сокетах, кроме как читать и писать в них, как если бы они были файлами. Я немного знаю об использовании селекторов сокетов. Я не понимаю, почему вы должны сбросить сокет, что на самом деле там происходит? Биты просто болтаются где-то в памяти, пока их не оттолкнут? Я читал некоторые вещи онлайн о сокетах, но все это очень абстрактно и на высоком уровне.

Что на самом деле здесь происходит?

Ответы [ 4 ]

48 голосов
/ 27 мая 2009

При записи в сетевой сокет и отправке данных накладываются определенные накладные расходы. Если бы данные отправлялись каждый раз, когда в сокет поступал байт, вы бы получили 40+ байтов заголовка TCP на каждый байт фактических данных. (Конечно, если вы используете сокет TCP. Другие сокеты будут иметь разные значения). Чтобы избежать такой неэффективности, сокет поддерживает локальный буфер, который обычно составляет более 1000 байтов. Когда этот буфер заполнен, заголовок оборачивается вокруг данных, и пакет отправляется по назначению.

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

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

10 голосов
/ 11 августа 2011

Вы не можете действительно сбросить сокет.

Как заставить сокет отправлять данные в свой буфер? )

Вы не можете заставить это. Период. TCP решает, когда может отправлять данные. Теперь, обычно, когда вы вызываете write () для сокета TCP,
TCP действительно отправит сегмент, но нет гарантии и нет способа заставить это. Есть много причин, по которым TCP не будет отправлять
сегмент: закрытое окно и алгоритм Нэгла - это две вещи, которые
немедленно приходи на ум.

Прочитайте полный пост, он довольно углублен и многое прояснил для меня.

2 голосов
/ 06 июня 2009

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

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

1 голос
/ 27 мая 2009

Я не использовал flush для программирования сокетов. Я действительно помню где-то, что есть режимы, которые вы можете установить, когда потоковые отправления пытаются уменьшить количество отправляемых небольших пакетов. Однако вы должны использовать sendall (), чтобы убедиться, что все в буфере отправлено.

Функция shutdown () очень полезна при спулинге. Конечно, вы должны использовать вызов close (), если не хотите, чтобы что-то болталось.

Посмотрите Руководство Биджа для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...