1 | var tcp_wrap = process.binding('tcp_wrap')
|
2 | var TCP = tcp_wrap.TCP;
|
3 | var errno = require('util')._errnoException;
|
4 |
|
5 |
|
6 | var v = process.version.substr(1).split('.').map(x=>Number(x))
|
7 | var is_recent_node = (v[0] >= 10
|
8 | || (v[0] >= 9 && v[1] >= 3)
|
9 | || (v[0] >= 8 && v[1] >= 11 && v[2] >= 2))
|
10 |
|
11 | module.exports = function (addr, port) {
|
12 | if (typeof addr === 'number' || /^\d+$/.test(addr)) {
|
13 | var p = port;
|
14 | port = addr;
|
15 | addr = p;
|
16 | }
|
17 | if (!port) port = 0;
|
18 | if (!addr) addr = '0.0.0.0';
|
19 | if (is_recent_node)
|
20 | var h = new TCP(tcp_wrap.constants && tcp_wrap.constants.SERVER);
|
21 | else
|
22 | var h = new TCP;
|
23 | var r = /:/.test(addr)
|
24 | ? h.bind6(addr, port)
|
25 | : h.bind(addr, port)
|
26 | ;
|
27 | if (r) {
|
28 | error(r, 'bind');
|
29 | }
|
30 |
|
31 | var sock = {};
|
32 | if (/^v0\.10\./.test(process.version)) {
|
33 | sock = h.getsockname && h.getsockname();
|
34 | if (!sock || (port && port !== sock.port)) {
|
35 | error('EADDRINUSE', 'bind');
|
36 | }
|
37 | else return h.fd;
|
38 | }
|
39 | else {
|
40 | var s = h.getsockname && h.getsockname(sock);
|
41 | if (s || (port && port !== sock.port)) {
|
42 | error('EADDRINUSE', 'bind');
|
43 | }
|
44 | else {
|
45 | return h.fd;
|
46 | }
|
47 | }
|
48 | };
|
49 |
|
50 | function error (code, syscall) {
|
51 | if (process._errno) {
|
52 | var ex = new Error(syscall + ' ' + process._errno);
|
53 | ex.errno = ex.code = code;
|
54 | ex.syscall = syscall;
|
55 | throw ex;
|
56 | }
|
57 | else if (errno && code !== 'EADDRINUSE') {
|
58 | throw errno(code, syscall);
|
59 | }
|
60 | else {
|
61 | var ex = new Error(syscall + ' ' + code);
|
62 | ex.errno = code;
|
63 | ex.syscall = syscall;
|
64 | throw ex;
|
65 | }
|
66 | } |
\ | No newline at end of file |