如果我强制终止进程然后尝试重新启动它,则会出现EADDRINUSE错误

时间:2016-09-23 13:51:50

标签: node.js sockets unix ipc unix-socket

var arDrone = require('ar-drone');
var PaVEParser = require('./PaVEParser');
var output = require('fs').createWriteStream('./vid.h264');
var client;
var mostRecentFrame;
var frameCounter = 0;

const net = require('net');
const server = net.createServer((c) => {
  // 'connection' listener
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
    c.on('data', (data) => {
    c.write(mostRecentFrame);
    });
});
server.on('error', (err) => {
  throw err;
});
server.listen('/tmp/ard.sock', () => {
  console.log('server bound');
});

process.stdin.on('data', function() {
    console.log("Ending the program, landing the drone and terminating the connection.");
    server.close();
    process.exit();
});

当我强行杀死这个程序时,我无法重新启动它。

daniel@beepboop:~/AR-drone Project$ node test-save-pngs-no-flight.js 
/home/daniel/AR-drone Project/test-save-pngs-no-flight.js:24
  throw err;
  ^

Error: listen EADDRINUSE /tmp/ard.sock
    at Object.exports._errnoException (util.js:1036:11)
    at exports._exceptionWithHostPort (util.js:1059:20)
    at Server._listen2 (net.js:1239:19)
    at listen (net.js:1288:10)
    at Server.listen (net.js:1377:5)
    at Object.<anonymous> (/home/daniel/AR-drone Project/test-save-pngs-no-flight.js:26:8)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)

我认为这是因为套接字没有正确关闭。

  1. 当我强行杀死它时,如何让程序关闭套接字,
  2. 如何从命令行手动关闭套接字?
  3. 编辑:

    我使用的是Ubuntu 16.04。通过武力杀戮,我的意思是我正在击中&#34; control-C&#34;在运行期间。

1 个答案:

答案 0 :(得分:1)

是的,这是它的工作原理。这是重现它的一个较短的例子:

var net = require('net');
const server = net.createServer((c) => {
});
server.on('error', (err) => {
  throw err;
});
server.listen('/tmp/x.sock', () => {
  console.log('server bound');
});

您可以通过运行来避免此问题:

server.close();
程序退出前

在您的情况下,您可以通过处理SIGINT来避免该问题:

var net = require('net');
const server = net.createServer((c) => {
});
server.on('error', (err) => {
  throw err;
});
server.listen('/tmp/x.sock', () => {
  console.log('server bound');
});
process.on('SIGINT', () => {
  server.close();
  process.exit();
});

另见:

相关问题