Невозможно установить связь между сервером сокета домена Node.js и клиентом сокета домена C на Linux - PullRequest
0 голосов
/ 27 мая 2020

Вот код 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');
       });

Я запускаю его первым. Созданный файл сокета:

    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. Как сообщить серверу узла, что он находится в режиме DGRAM, а не в режиме STREAM?

1 Ответ

0 голосов
/ 27 мая 2020

Node.js не поддерживает сокеты домена UNIX в режиме DGRAM. Только в режиме STREAM!

...