Поскольку LIBUV V1.35.0 (Узел
v13.12.0&v12.17.0), какTCP_KEEPINTVL, так иTCP_KEEPCNTимеют несколько предсказуемых значений, этот пакет позволяет вам настраивать эти значения на каждую сокет, но при стоимости справляться с накладными расходом FFI и его зависимости. Проверьте последние документы узла для Socket.SetakePaliveenable, если значения по умолчанию достаточно хороши для вас, вам не нужно использовать этот пакет.
Отсутствующие ( TCP_KEEPINTVL и TCP_KEEPCNT ) SO_KEEPALIVE SOCKET STETERS и GETETERS для узла с использованием FFI.
Протестировано на linux & osx (как amd64 , так и arm64 ), должен работать на freebsd и других. Установка на win32 , но методы не являются OPS (просьбы о привлечении).
Существует также поддержка для получения и настройки опции TCP_USER_TIMEOUT (только linux и osx ), которая тесно связана с Keep-Alive.
| Платформа | Tcp_keepintvl | Tcp_keepcnt | Tcp_user_timeout |
|---|---|---|---|
linux | |||
osx | ( TCP_RXT_CONNDROPTIME ) | ||
freebsd | |||
win32 |
Легенда:
npm install --save net-keepaliveВы можете найти полный справочный документ API (JSDOC), опубликованный на наших страницах GitHub.
Проект включает в себя файл определений TypeScript ( index.d.ts ), который дает обзор открытого API.
Документация генерируется из комментариев JSDOC, не стесняйтесь улучшить их, отправляя запросы на привлечение.
const Net = require ( 'net' ) ,
NetKeepAlive = require ( 'net-keepalive' )
// or
import * as Net from 'net'
import * as NetKeepAlive from 'net-keepalive'
// Create a TCP Server
const srv = Net . createServer ( ( s ) => {
console . log ( 'Connected %j' , s . address ( ) )
// Doesn't matter what it does
s . pipe ( s )
} )
// Start on some port
srv . listen ( 1337 , ( ) => {
console . log ( 'Listening on %j' , srv . address ( ) )
} )
// Connect to that server
const s = Net . createConnection ( { port : 1337 } , ( ) => {
console . log ( 'Connected to %j' , s . address ( ) )
//IMPORTANT: KeepAlive must be enabled for this to work
s . setKeepAlive ( true , 1000 )
// Set TCP_KEEPINTVL for this specific socket
NetKeepAlive . setKeepAliveInterval ( s , 1000 )
// Get TCP_KEEPINTVL for this specific socket
NetKeepAlive . getKeepAliveInterval ( s ) // 1000
// Set TCP_KEEPCNT for this specific socket
NetKeepAlive . setKeepAliveProbes ( s , 1 )
// Get TCP_KEEPCNT for this specific socket
NetKeepAlive . getKeepAliveProbes ( s ) // 1
} ) Теперь с помощью iptables добавьте правило, чтобы отбросить все пакеты tcp в цепочке INPUT в порт 1337 .
iptables -I INPUT -m tcp -p tcp --dport 1337 -j DROP Если вы отслеживали пакеты на loopback с tcp.srcport == 1337 || tcp.dstport == 1337 Фильтр в wireshark . Вы увидите следующий вывод:
Веселиться!
Больше информации о SO_KEEPALIVE ЗДЕСЬ: TCP Keepalive Howto C Примеры кода здесь: Примеры
ПРИМЕЧАНИЕ. Для этих методов для работы вы должны включить SO_KEEPALIVE и установить параметры TCP_KEEPIDLE для сокета, используя Net.Socket -s встроенный в socket.setKeepAlive([enable][, initialDelay]) метода.
TCP_KEEPIDLE (since Linux 2.4) The time (in seconds) the connection needs to remain idle before TCP starts sending keepalive probes, if the socket option SO_KEEPALIVE has been set on this socket. This option should not be used in code intended to be portable.
const NetKeepAlive = require ( 'net-keepalive' )
// or
import * as NetKeepAlive from 'net-keepalive'
// .....
const enable = true // enable SO_KEEPALIVE
const initialDuration = 1000 // start probing after 1 second of inactivity
socket . setKeepAlive ( enable , initialDuration ) // sets SO_KEEPALIVE and TCP_KEEPIDLE
const probeInterval = 1000 // after initialDuration send probes every 1 second
NetKeepAlive . setKeepAliveInterval ( socket , probeInterval ) //sets TCP_KEEPINTVL
const maxProbesBeforeFail = 10 // after 10 failed probes connection will be dropped
NetKeepAlive . setKeepAliveProbes ( socket , maxProbesBeforeFail ) // sets TCP_KEEPCNT
// .... См. Code_of_conduct.md
См. Appling.md
Спасибо этим замечательным людям (ключ эмодзи):
Джордж Херц | Альба Мендес | Пауло Кастро | Джейкоб Джуэлл | Rmutharaju | Рафаэль Борхес | Кальвин |
GGSUBS | Марио Козджак | Лукас Кнут | Иван | Отавио Якоби |
Этот проект следует за спецификацией всех контролей. Взносы любого вида приветствуются!