2015-01-05 2 views
3

Быстрый и основной nodeJs вопрос, Я работаю с UNIX сокета для связи между серверами между C++ приложения и мой сервер 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'); 
    ... 
}); 

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

+0

Вы пытаетесь запустить * сервер * в Unix-сокете или * подключиться * к существующему сокету unix? Если последний, вы проверяли разрешения на '/ tmp/unixSocket'? Если первое, вы должны использовать 'net.createServer()' вместо этого. – mscdex

+0

У меня возникли проблемы с этим, я могу сказать, что внутреннее состояние приложения C++ может быть изменено пользователем через nodeJs. должен ли этот NodeJ быть сервером или клиентом? – Hahn

+0

Мой unix-сокет был объявлен ранее, я удалил его с помощью: ** fs.unlink (socketpath) **. – Hahn

ответ

0

Итак, здесь есть некоторые недоразумения. Начнем с того, что такое «unix socket». Я думаю, вы думаете, что это просто файловый элемент, который действует как сервер самостоятельно через файловую систему OS /. Это не совсем правильно. Хотя он действительно связан через файловую систему, это не обычный файл. Вместо этого он похож на сокет 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, чтобы использовать его 'address'/path