1.0.9 • Published 2 years ago

@pdz/portbinder v1.0.9

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

Local TCP ports binding before use in sockets. Written in C and NAPI. Currently supports IPv4 only.

Example:

'use strict';

const portbinder = require('@pdz/portbinder');
const net = require('net');

let rsv;

try {
	rsv = portbinder.bind("8.8.8.8"); // Reserve port on 8.8.8.8 
} catch(e) {
	console.error('Port binding error:', e.message); // You not have premissions to 8.8.8.8 binding
}

try {
	rsv = portbinder.bind(""); // Reserve port on default IP
	console.log(rsv, 'Reserved');
} catch(e) {
	console.error(e); // No errors
}

const test = (rsv) => { // Test connection from reserved port
	const sock = new net.Socket()
	.once('connect', () => {
		console.log(rsv, 'Connected');
		sock.end().destroy();
	})
	.once('close', () => {
		console.log(rsv, 'Closed');
	})
	.once('error', (e) => {
		sock.end().destroy();
		console.error(rsv, 'Error:', e.code);
		// In first connect port is binded and connection fails with EADDRINUSE
		if(e.code == 'EADDRINUSE') {
			portbinder.unbind(rsv.fd); // Release binded port and try reconnect
			test(rsv); // Connection without errors
		}
	})
	.connect({
		host: 'example.com',
		port: 80,
		localAddress: rsv.ip,
		localPort: rsv.port
	});
}

test(rsv);

Result:

Port binding error: Cannot assign requested address
{ fd: 22, port: 58273, ip: '0.0.0.0' } Reserved
{ fd: 22, port: 58273, ip: '0.0.0.0' } Error: EADDRINUSE
{ fd: 22, port: 58273, ip: '0.0.0.0' } Closed
{ fd: 22, port: 58273, ip: '0.0.0.0' } Connected
{ fd: 22, port: 58273, ip: '0.0.0.0' } Closed
1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago