справочная страница send() показывает флаг MSG_MORE
, который, как утверждается, действует как TCP_CORK
. У меня есть функция-оболочка вокруг send()
:
int SocketConnection_Write(SocketConnection *this, void *buf, int len) {
errno = 0;
int sent = send(this->fd, buf, len, MSG_NOSIGNAL);
if (errno == EPIPE || errno == ENOTCONN) {
throw(exc, &SocketConnection_NotConnectedException);
} else if (errno == ECONNRESET) {
throw(exc, &SocketConnection_ConnectionResetException);
} else if (sent != len) {
throw(exc, &SocketConnection_LengthMismatchException);
}
return sent;
}
Предполагая, что я хочу использовать буфер ядра, я мог бы использовать TCP_CORK
, включить его всякий раз, когда это необходимо, а затем отключить его, чтобы сбросить буфер. Но с другой стороны, тем самым возникает необходимость в дополнительном системном вызове. Таким образом, использование MSG_MORE
кажется мне более подходящим. Я бы просто изменил указанную выше строку send() на:
int sent = send(this->fd, buf, len, MSG_NOSIGNAL | MSG_MORE);
Согласно lwm.net, пакеты будут сброшены автоматически, если они достаточно велики:
Если приложение устанавливает этот параметр для сокета, ядро не будет отправлять короткие пакеты. Вместо этого он будет ждать, пока не появится достаточно данных для заполнения пакета максимального размера, а затем отправит его. Когда TCP_CORK отключен, все оставшиеся данные будут передаваться по сети.
Но этот раздел относится только к TCP_CORK
. Теперь, как правильно сбрасывать пакеты MSG_MORE
?
Я могу думать только о двух возможностях:
- Вызовите send() с пустым буфером и без установки
MSG_MORE
- Повторно примените параметр TCP_CORK, как описано в эта страница
К сожалению, вся тема очень плохо документирована, и я не смог найти много в Интернете.
Мне также интересно, как проверить, что все работает как положено? Очевидно, запустить сервер через strace
не вариант. Таким образом, самым простым способом было бы использовать netcat
, а затем посмотреть на его вывод strace
? Или ядро будет по-другому обрабатывать трафик, передаваемый через петлевой интерфейс?
MSG_MORE
. Затем кеш сбрасывается при возврате sendfile(). - person user206268   schedule 31.03.2010