Ошибка EPROTOTYPE при попытке подключения клиента сокета unix node.js к программе C - PullRequest
0 голосов
/ 31 января 2019

Я переписываю PHP-приложение в Node.js.Программа AC работает на ОС Linux, на которой также установлен PHP.

Короче говоря, программа C обрабатывает отправку данных из веб-интерфейса PHP на некоторое проприетарное оборудование.Он также обрабатывает создание файла сокета и выполняет другие задачи.

В устаревшем коде PHP работает, как ожидается, путем привязки к сокету и передает / получает данные, как и ожидалось.

Iнаписал сценарий для сервера и клиента Node.js, чтобы убедиться, что я могу создавать и подключаться к сокетам домена Unix с помощью встроенного модуля net.Это работает, как и ожидалось.

Однако, когда я пытаюсь подключить клиент сокета node.js к файлу сокета, созданному программой C, я вижу следующую ошибку:

{
    Error: connect EPROTOTYPE /var/run/arcontroller-master.socket
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
    code: 'EPROTOTYPE',
    errno: 'EPROTOTYPE',
    syscall: 'connect',
    address: '/var/run/arcontroller-master.socket'
}

Researchпоказал, что EPROTOTYPE: Protocol wrong type for socket.В документации сетевого модуля не содержится информации о том, почему протокол неверен или как определить правильный протокол.

Можете ли вы определить другой протокол в файле node.js?Возможно, это недоразумение с моей стороны, но я подумал, что IPC - это просто IP-соединение через сокет домена unix.Я здесь ошибаюсь?

Дополнительная информация: Программа на C использует sys/socket lib под капотом, краткое описание процесса создания сокета изложено ниже:

// Open up the socket we're listening on    
struct sockaddr_un server_address;

server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, socketFile);

sock = socket(AF_UNIX, SOCK_DGRAM, 0);

Дальнейшее чтение показываетSOCK_DGRAM is a UDP socket - что мне здесь не хватает?

1 Ответ

0 голосов
/ 31 января 2019

См. man unix(7):

EPROTOTYPE Удаленный сокет не соответствует типу локального сокета (SOCK_DGRAM против SOCK_STREAM).


Я могу создавать и подключаться к сокетам домена Unix, используя собственный модуль 'net'.

net предоставляет потоковые сокеты, а не дейтаграммы.По этой причине вы наблюдаете ошибку.

Вам необходимо использовать сокет дейтаграммы в вашем коде node.js.См. Документацию по node.js для UDP / датаграмм сокетов .

...