Связь между C и NodeJS с использованием node-ipc и unix сокетов - PullRequest
0 голосов
/ 11 октября 2018

Этот вопрос следует из следующего:

Обмен данными между NodeJS и C с использованием сокетов node-ipc и unix

В отношении принятого решения (https://stackoverflow.com/a/39848936/1834057), Мне было интересно, если кто-то сможет уточнить, как именно отправить данные с C на Node.js . Решение демонстрирует отправку данных с Node.js на C ,но не наоборот. У меня есть приложение, которое требует двусторонней связи, поэтому для меня критически важен отсутствующий компонент.

В моем понимании сокетов unix, один из write, send или sendmsg должен быть в состоянии выполнить работу, однако мне не повезло. Если это понимание неверно, пожалуйста, сообщите.

Чтобы запустить тривиальный пример, скажем, когда сообщение читается вкод C позволяет отправить обратно сообщение и попытаться вызвать событие ipc.of[socketId].on('message',...) на сервере узла.

Что означает, что я пытаюсь включить это:

while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
      printf("read %u bytes: %.*s\n", rc, rc, buf);
}

В это:

while ( (rc=read(cl,buf,sizeof(buf)) ) > 0) {
  printf("read %u bytes: %.*s\n", rc, rc, buf);

  //Respond to the node server
  int n;
  char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\t";
  if((n = write(fd,msg,sizeof(msg))) < 0){
      printf("send failed\n");
  }else{
      printf("sent %d bytes\n", n);
  }
}

Это шможет означать, что полный код server.c теперь становится:

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string.h> //Missing from original server.c

char *socket_path = "/tmp/icp-test";

int main(int argc, char *argv[]) {
  struct sockaddr_un addr;
  char buf[100];
  int fd,cl,rc;

  if (argc > 1) socket_path=argv[1];

  if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
    perror("socket error");
    exit(-1);
  }

  memset(&addr, 0, sizeof(addr));
  addr.sun_family = AF_UNIX;
  if (*socket_path == '\0') {
    *addr.sun_path = '\0';
    strncpy(addr.sun_path+1, socket_path+1, sizeof(addr.sun_path)-2);
  } else {
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);
    unlink(socket_path);
  }

  if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
    perror("bind error");
    exit(-1);
  }

  if (listen(fd, 5) == -1) {
    perror("listen error");
    exit(-1);
  }

  while (1) {
    if ( (cl = accept(fd, NULL, NULL)) == -1) {
      perror("accept error");
      continue;
    }

    while ( (rc=read(cl,buf,sizeof(buf)) ) > 0) {
      printf("read %u bytes: %.*s\n", rc, rc, buf);

      //Respond to the node server
      int n;
      char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\t";
      if((n = write(fd,msg,sizeof(msg))) < 0){
          printf("send failed\n");
      }else{
          printf("sent %d bytes\n", n);
      }
    }

    if (rc == -1) {
      perror("read");
      exit(-1);
    }
    else if (rc == 0) {
      printf("EOF\n");
      close(cl);
    }
  }
  return 0;
}

Теперь, к сожалению, сообщение для записи возвращает код -1 и не принимается node.jsсервер.

Код client.js остается неизменным и соответствует исходному вопросу.

Может кто-нибудь уточнить, что я делаю неправильно?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы должны изменить

char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\t";
if((n = write(fd,msg,sizeof(msg))) < 0){
    printf("send failed\n");
}else{
    printf("sent %d bytes\n", n);
}

на

char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\f";
if((n = write(cl,msg,strlen(msg))) < 0){
    printf("send failed\n");
}else{
    printf("sent %d bytes\n", n);
}

Библиотека ожидает \ f в конце сообщения: -)

надеюсь, ответ не слишком поздно: -)

...