尝试将 node.js unix 套接字客户端连接到 C 程序时出现 EPROTOTYPE 错误

EPROTOTYPE error whilst attempting to connect node.js unix socket client to C program

我正在 Node.js 中重写一个 PHP 应用程序。 一个 C 程序在 Linux OS 上运行,该 Linux OS 也承载 PHP.

简而言之,C 程序处理从 PHP 网络界面向某些专有硬件发送数据。它还处理套接字文件的创建和各种其他任务。

在遗留代码中,PHP 通过绑定到套接字和 transmits/receives 数据按预期运行。

我已经编写了 Node.js 服务器和客户端脚本,以了解我可以使用本机 'net' 模块创建和连接到 Unix 域套接字。这按预期工作。

但是,当我尝试将 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'
}

研究表明 EPROTOTYPE: Protocol wrong type for socket。 net 模块文档中没有给出协议错误原因或如何定义正确协议的信息。

你能在 node.js 中定义不同的协议吗?也许这是我的误解,但我认为 IPC 只是通过 unix 域套接字的 IP 连接。我这里搞错了?

更多信息: C 程序在后台使用 sys/socket 库,下面概述了套接字创建过程的摘要:

// 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 - 我在这里错过了什么?

参见man unix(7)

EPROTOTYPE Remote socket does not match the local socket type (SOCK_DGRAM versus SOCK_STREAM).


I can create and connect to Unix Domain sockets using the native 'net' module.

net 模块提供流套接字,而不是数据报。这就是您观察到错误的原因。

您需要在 node.js 代码中使用数据报套接字。参见 node.js UDP / Datagram Sockets.

的文档