У меня есть простое соединение 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-соединение.
IPPROTO_TCP
, кажется, работает для свойств, основанных на числах, таких какTCP_KEEPIDLE
,TCP_KEEPINTVL
иTCP_KEEPCNT
. Похоже, что логическое значение, основанное на свойствах включения/выключения, установлено на уровнеSOL_SOCKET
. Потихоньку лучше в этом разбираюсь. - person TheWaterProgrammer   schedule 26.11.2019SOL_SOCKET
дляSO_*
вариантов иIPPROTO_TCP
дляTCP_*
вариантов. - person user207421   schedule 27.11.2019