尝试将 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.
的文档
我正在 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
versusSOCK_STREAM
).
I can create and connect to Unix Domain sockets using the native 'net' module.
net
模块提供流套接字,而不是数据报。这就是您观察到错误的原因。
您需要在 node.js 代码中使用数据报套接字。参见 node.js UDP / Datagram Sockets.
的文档