【问题标题】:Unable to communicate between Node.js domain socket server and C domain socket client on Linux无法在 Linux 上的 Node.js 域套接字服务器和 C 域套接字客户端之间进行通信
【发布时间】:2020-05-27 13:18:44
【问题描述】:

这是 Node.js 代码:

       net = require('net');
       fs  = require('fs');
       serverSocketFile = '/tmp/_mediaComm';
       if (fs.existsSync(serverSocketFile))
         fs.unlinkSync(serverSocketFile);
       var server = net.createServer((socket) => {
         console.log("Connection received.");
         socket.on('data', (data) => {
            //console.log(...);
         });
         //...
       });   
       server.on('error', (err) => {
         console.log("Error:" + err);
       });
       server.listen(serverSocketFile, () => {
          fs.chmodSync(serverSocketFile, '0777');
       });

我先开始。创建的socket文件是:

    ls -l /tmp/_mediaComm
    srwxrwxrwx 1 usr1 usr1 0 May 27 16:28 /tmp/_mediaComm

这里是 C 客户端代码的相关部分

   int retStatus;
   struct sockaddr_un clientUnixSocket;
   struct sockaddr_un serverUnixSocket;
   int fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_NONBLOCK, 0);
   if (fd < 0) {
     perror("Socket create error");
   };
   clientUnixSocket.sun_family = AF_UNIX;
   strcpy(clientUnixSocket.sun_path, "/tmp/_clientComm");
   unlink("/tmp/_clientComm");
   if (bind(fd, (struct sockaddr *)&clientUnixSocket, sizeof(clientUnixSocket)) < 0) {
     perror("Client bind error");
   }
   serverUnixSocket.sun_family = AF_UNIX;
   strcpy(serverUnixSocket.sun_path, "/tmp/_mediaComm");
   printf("Sending data...\n");
   retStatus = sendto(fd, "Hi", 2, 0, (struct sockaddr *) &serverUnixSocket, sizeof(struct sockaddr_un));
     if (retStatus == -1) {
         perror("SENDTO ERROR");
     }
     else {
         printf("Data sent!\n");
     }

我从 C 程序中得到以下错误:

 Sending data...
 SENDTO ERROR: Protocol wrong type for socket
  1. 我在 C 代码中缺少什么?还有
  2. 我们如何告诉 Node 服务器处于 DGRAM 而不是 STREAM 模式?

【问题讨论】:

    标签: c node.js linux sockets unix-socket


    【解决方案1】:

    Node.js 不支持 DGRAM 模式下的 UNIX 域套接字。仅在 STREAM 模式下!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 2018-06-30
      • 2018-01-20
      • 2013-06-24
      • 2013-05-14
      • 2022-09-28
      • 2015-09-27
      • 2012-04-21
      相关资源
      最近更新 更多