尝试将 node.js unix 套接字客户端连接到 C 程序时出现 EPROTOTYPE 错误
Posted
技术标签:
【中文标题】尝试将 node.js unix 套接字客户端连接到 C 程序时出现 EPROTOTYPE 错误【英文标题】:EPROTOTYPE error whilst attempting to connect node.js unix socket client to C program 【发布时间】:2019-01-31 15:43:29 【问题描述】:我正在用 Node.js 重写一个 php 应用程序。 C 程序在也托管 PHP 的 Linux 操作系统上运行。
简而言之,C 程序处理从 PHP Web 界面向某些专有硬件发送数据。它还处理套接字文件的创建以及各种其他任务。
在遗留代码中,PHP 通过绑定到套接字按预期运行并按预期传输/接收数据。
我已经编写了 Node.js 服务器和客户端脚本,以查看我可以使用本机“网络”模块创建和连接到 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
。
网络模块文档中没有提供有关协议错误的原因或如何定义正确协议的信息。
你能在 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
- 我在这里缺少什么?
【问题讨论】:
SOCK_DGRAM
是一个数据报套接字。协议 IP + SOCK_DGRAM
是 UDP。协议 Unix + SOCK_DGRAM
是 Unix 数据报套接字,而不是 UDP。
【参考方案1】:
见man unix(7)
:
EPROTOTYPE
远程套接字与本地套接字类型不匹配(SOCK_DGRAM
与SOCK_STREAM
)。
我可以使用本机“网络”模块创建并连接到 Unix 域套接字。
net
模块提供流套接字,而不是数据报。这就是您观察到错误的原因。
您需要在 node.js 代码中使用数据报套接字。见 node.js UDP / Datagram Sockets 的文档。
【讨论】:
感谢您的解释。似乎 Node 在许多版本之前都放弃了对跨 Unix 域套接字的 UDP 的支持。尽管与原生模块相比,里程可能会有所不同,但这个包可以代替它使用:github.com/bnoordhuis/node-unix-dgram @wntwrk 嗯,我发布的链接适用于 node.js 版本 9。 是的,UDP 可以按照您的建议与数据报模块一起使用,但它只接受 IP 地址/端口值,而不参考接受套接字文件路径。使用套接字文件路径测试失败以上是关于尝试将 node.js unix 套接字客户端连接到 C 程序时出现 EPROTOTYPE 错误的主要内容,如果未能解决你的问题,请参考以下文章
通过套接字连接将 https 代理请求传递到命名管道(node.js)
带有 libevent/libev 的 C 或 C++:监视 unix 套接字
客户端和服务器端(React/Node.js)之间的 Socket.io 连接失败
客户端网络套接字在建立安全 TLS 连接之前断开连接 Node.js v13.0.1