IPPROTO_TCP или SOL_SOCKET

У меня есть простое соединение P2P между моими одноранговыми узлами через сокет TCP. Мой клиент и сервер работают на Linux. Я включил функции TCP keep_alive для своих TCP-сокетов на обоих стороны. Я использую boost::asio для подключения, чтение и запись данных на моих сокетах tcp с обеих сторон.

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

Код:

int on = 1;
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(int)
int timeOut = 3; //seconds
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPIDLE, &timeOut, sizeof(int)
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPINTVL, &timeOut, sizeof(int))
int unackCount = 1;
setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPCNT, &unackCount, sizeof(int))

OR

int on = 1;
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_NODELAY, &on, sizeof(int)
int timeOut = 3; //seconds
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPIDLE, &timeOut, sizeof(int)
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPINTVL, &timeOut, sizeof(int))
int unackCount = 1;
setsockopt(socketNativeHandle, SOL_SOCKET, TCP_KEEPCNT, &unackCount, sizeof(int))

Вопрос.
Должен ли я использовать SOL_SOCKET с обеих сторон или должен использовать IPPROTO_TCP с обеих сторон? Есть ли способ решить это во время выполнения? Обратите внимание, что у меня очень простое одноранговое Wi-Fi-соединение.


person TheWaterProgrammer    schedule 26.11.2019    source источник
comment
Успешная компиляция необходима, но недостаточна для доказательства правильности. Какой из них действительно работает? Вам конечно не нужен способ решить это во время выполнения.   -  person user207421    schedule 26.11.2019
comment
IPPROTO_TCP, кажется, работает для свойств, основанных на числах, таких как TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT. Похоже, что логическое значение, основанное на свойствах включения/выключения, установлено на уровне SOL_SOCKET. Потихоньку лучше в этом разбираюсь.   -  person TheWaterProgrammer    schedule 26.11.2019
comment
Я предлагаю SOL_SOCKET для SO_* вариантов и IPPROTO_TCP для TCP_* вариантов.   -  person user207421    schedule 27.11.2019


Ответы (1)


SOL — это сокращение от socket_level, предназначенное для SO_* параметров, таких как SO_REUSEPORT

IPPROTO_* предназначен для опций конкретного сетевого протокола, например IPPROTO_IP, IPPROTO_TCP

Более:

person Jiacai Liu    schedule 14.12.2019