尝试将node.js UNIX套接字客户端连接到C程序时发生EPROTOTYPE错误

时间:2019-01-31 15:43:30

标签: c node.js ipc unix-socket

我正在Node.js中重写一个PHP应用程序。 一个C程序在还托管PHP的Linux OS上运行。

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

在旧版代码中,PHP通过绑定到套接字按预期运行,并按预期方式发送/接收数据。

我已经编写了Node.js Server和Client脚本,以查看可以使用本机“ net”模块创建并连接到Unix Domain套接字。这可以按预期工作。

但是,当我尝试将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 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 :(得分:1)

请参见man unix(7)

  

EPROTOTYPE远程套接字与本地套接字类型(SOCK_DGRAMSOCK_STREAM)不匹配。


  

我可以使用本地的“ net”模块创建并连接到Unix域套接字。

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

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