【发布时间】: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。
标签: c node.js ipc unix-socket