Проверьте, работает ли UDP-сокет на определенном порту, закройте его и запустите снова. - PullRequest
1 голос
/ 06 мая 2019

Я работаю с UDP-сокетами, у меня возникает определенная проблема: когда код запускается в первый раз, он работает, но когда он запускается во второй раз, он выдает мне эту ошибку:

at _handle.lookup (dgram.js:266:18)  
at _combinedTickCallback (internal/process/next_tick.js:142:11)
at process._tickCallback (internal/process/next_tick.js:181:9)

Я сделал вывод, что эта ошибка возникает из-за того, что порт все еще используется, поэтому я пытаюсь работать с примером кода, который проверяет, работает ли сокет на определенном порту, если да, закройте его, а затем снова создайте сокетна тот же порт.

Вот пример кода:

var PORT = 7777;
var HOST = '10.0.1.10';

var dgram = require('dgram');
var server = dgram.createSocket('udp4');

gener(server, PORT, HOST);

function gener(sock, prt, hst){
        sock.close();
        sock.bind(prt, hst);
}

server.on('listening', function () {
    var address = server.address();
    console.log('UDP Server listening on ' + address.address + ":" + address.port);
});

server.on('message', function (message, remote) {
    console.log(remote.address + ':' + remote.port +' - ' + message);

});

Когда я его запускаю, выдается следующая ошибка:

dgram.js:638
    throw new errors.Error('ERR_SOCKET_DGRAM_NOT_RUNNING');
    ^

Error [ERR_SOCKET_DGRAM_NOT_RUNNING]: Not running
    at Socket._healthCheck (dgram.js:638:11)
    at Socket.bind (dgram.js:186:8)
    at gener (/home/caracall/Desktop/server.js:11:18)
    at Object.<anonymous> (/home/caracall/Desktop/server.js:7:1)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Function.Module.runMain (module.js:694:10)

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Это проблема:

function gener(sock, prt, hst){
        sock.close();
        sock.bind(prt, hst);
}

Вы определенно не можете закрыть сокет, а затем ожидать, что "связывание" завершится сразу же после этого.Вам нужно создать новый сокет.Вы, вероятно, хотите что-то ближе к этому:

function gener(sock, prt, hst){
        if (sock) {
            sock.close();
            sock = null;
        }
        sock = dgram.createSocket('udp4');
        sock.bind(prt, hst);
}
0 голосов
/ 07 мая 2019

Вы пытаетесь связать с закрытым сокетом, поэтому выдается ошибка ERR_SOCKET_DGRAM_NOT_RUNNING. Пожалуйста, обратитесь к документу Node.js :

Если связывание не удается, генерируется событие «ошибка». В редких случаях (например, при попытке связать с закрытым сокетом) может возникнуть ошибка.

Чтобы проверить, занят ли определенный порт, и завершить процесс владельца (опасная операция), вы можете использовать kill-port :

const kill = require('kill-port');
kill(7777);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...