نظرًا لأن Libuv v1.35.0 (العقدة
v13.12.0وv12.17.0) يتمتع كل منTCP_KEEPINTVLوTCP_KEEPCNTبقيم يمكن التنبؤ بها إلى حد ما ، حيث تتيح لك هذه الحزمة تعديل هذه القيم لكل مقبس ولكن بتكلفة للتعامل مع FFI النفقات العامة وتهمةها. تحقق من أحدث مستندات العقدة لـ Socket.SetKeepaliveenable ، إذا كانت القيم الافتراضية جيدة بما يكفي لك ، فأنت لا تحتاج إلى استخدام هذه الحزمة.
مفقود ( TCP_KEEPINTVL و TCP_KEEPCNT ) SO_KEEPALIVE SOCKET OPERS و GetTers للعقدة باستخدام FFI.
تم اختباره على linux & osx (كلا amd64 و arm64 ) ، يجب أن يعمل على freebsd وغيرها. التثبيت على win32 ولكن الأساليب هي عدم وجود OPS (ترحيب طلبات السحب).
هناك أيضًا دعم للحصول على خيار TCP_USER_TIMEOUT ( linux و osx فقط) ، والذي يرتبط ارتباطًا وثيقًا بـ Keep-Alive.
| منصة | TCP_KEPERINTVL | tcp_keepcnt | TCP_USER_TIMEOUT |
|---|---|---|---|
linux | |||
osx | ( TCP_RXT_CONNDROPTIME ) | ||
freebsd | |||
win32 |
أسطورة:
npm install --save net-keepaliveيمكنك العثور على وثيقة مرجعية API الكاملة (JSDOC) المنشورة على صفحات جيثب.
يتضمن المشروع ملف تعريفات TypeScript ( index.d.ts ) الذي يقدم نظرة عامة على واجهة برمجة التطبيقات المكشوفة.
يتم إنشاء الوثائق من تعليقات 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
انظر المساهمة
شكراً لهؤلاء الأشخاص الرائعين (مفتاح الرموز التعبيرية):
جورج هيرتز | ألبا منديز | باولو كاسترو | يعقوب جيويل | Rmutharaju | رافائيل بورخيس | كالفن |
GGSUBS | ماريو كوزجاك | لوكاس نوث | إيفان | أوتافيو جاكوبي |
يتبع هذا المشروع مواصفات جميع المساهمين. مساهمات من أي نوع ترحيب!