сокеты unix на nodeJs

Быстрый и базовый вопрос nodeJs, я работаю с сокетом unix для межсерверной связи между приложением С++ и моим сервером NodeJs,

Я написал свой сервер nodeJs так:

var net = require('net');
var unixSocketServer = net.createConnection('/tmp/unixSocket');
unixSocketServer.on('connect',function(){
    console.log('unix server socket connected on /tmp/unixSocket');
    ...
});

Однако я получаю сообщение об ошибке отказа от соединения. Я понимаю, что приложение С++ еще не открылось/не подключилось к сокету. Мои вопросы: почему это важно? не должен ли сервер nodeJs ждать, пока не произойдет событие «подключение»? Я использую nodeJs в настоящее время? я что-то упускаю?


person Hahn    schedule 05.01.2015    source источник
comment
Вы пытаетесь запустить сервер в сокете unix или подключиться к существующему сокету unix? Если второе, проверяли ли вы права доступа к /tmp/unixSocket? Если первое, вы должны вместо этого использовать net.createServer().   -  person mscdex    schedule 05.01.2015
comment
У меня возникли проблемы с выяснением этого. Мой вариант использования заключается в том, что внутреннее состояние приложения С++ может быть изменено пользователем через nodeJs. должен ли этот NodeJ быть сервером или клиентом?   -  person Hahn    schedule 05.01.2015
comment
Мой сокет unix был ранее объявлен, я удалил его с помощью: fs.unlink(socketpath).   -  person Hahn    schedule 07.01.2015


Ответы (1)


Хорошо, значит, здесь какое-то недоразумение. Давайте начнем с того, что такое «сокет unix». Я думаю, вы думаете, что это просто файлоподобный элемент, который действует как сервер сам по себе через ОС/файловую систему. Это не совсем правильно. Хотя он действительно привязан к файловой системе, на самом деле это не традиционный файл. Вместо этого это похоже на сокет TCP / IP, за исключением того, что вместо привязки IP и порта привязывается путь к файлу.

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

Чтобы создать сервер на сокете домена unix в узле, это довольно просто:

'use strict';

const net = require('net');
const unixSocketServer = net.createServer();

unixSocketServer.listen('/tmp/unixSocket', () => {
  console.log('now listening');
});

unixSocketServer.on('connection', (s) => {
  console.log('got connection!');
  s.write('hello world');
  s.end();
});

Обратите внимание, что есть еще одно различие между «обычными» сокетами и сокетами домена unix: после того, как сервер работает с сокетом домена unix, он не уничтожается автоматически. Вместо этого вы должны unlink /tmp/unixSocket повторно использовать этот «адрес»/путь

person Avery    schedule 14.01.2018
comment
Как отключить розетку? В документации нет информации о том, как это сделать. РЕДАКТИРОВАТЬ: Ах, удалив файл. fs.unlinkSync(ipcPath) - person Joakim L. Christiansen; 04.04.2021
comment
@JoakimL.Christiansen, да, fs.unlinkSync() — один из способов сделать это. В системах, поддерживающих сокеты unix, команда unlink, на которую я ссылался в посте, существует и является другим способом. - person Avery; 05.04.2021