Трудности при построении связи сокетов между c ++ и node.js (сервером) - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь построить соединение сокета между c ++ и сервером node.js. Это мой индекс. js код:

'use strict';

const express     = require('express');
const app         = express();
const serverHttp  = require('http').Server(app); 
const io = require('socket.io')(serverHttp);

const port = 8081;

io.on('connection', function (socket) {   
    socket.on('message', function (data) {
        console.log("key received!!!" + data);
    socket.emit('server', 'hello socket io');
        console.log("sent server msg");
    });
});

serverHttp.listen(port, function() {  
    console.log("init!!!");    
});

, и это мой код на C ++, который успешно компилируется:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif

#ifdef _WIN32
#define close(sockdep) closesocket(sockdep)
#define perror(errmsg) { fprintf(stderr, "%s: %d\n", (errmsg), WSAGetLastError()); }
#endif

#define net_assert(err, errmsg) { if ((err)) { perror(errmsg); assert(!(err)); } }

#define SERVER "localhost"
#define PORT 8081
#define BLEN 128

int
main(int argc, char *argv[])
{
  struct sockaddr_in server;
  struct hostent *sp;
  int sd;
  int n;
  char buf[BLEN];
#ifdef _WIN32
  int err;
  WSADATA wsa;
  extern int write();
  
  err = WSAStartup(MAKEWORD(2,2), &wsa);  // winsock 2.2
  net_assert(err, "sample client: WSAStartup");
#endif

  sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

  memset((char *) &server, 0, sizeof(struct sockaddr_in));
  server.sin_family = AF_INET;
  server.sin_port = htons((u_short) PORT);
  sp = gethostbyname(SERVER);
  memcpy(&server.sin_addr, sp->h_addr, sp->h_length);

  connect(sd, (struct sockaddr *) &server, sizeof(struct sockaddr_in));
    
  n = recv(sd, buf, sizeof(buf), 0);
  while (n > 0) {
    write(1, buf, n);
    n = recv(sd, buf, sizeof(buf), 0);
  } 

  close(sd);

#ifdef _WIN32
  WSACleanup();
#endif
  exit(0);
}

Моя среда - Ma c, и я использую Xcode для компиляции c ++. Я подключаю узел с node index.js к localhost, а также компилирую и запускаю программу на C ++. Однако, когда я открываю localhost: 8081, я получаю эту ошибку в консоли:

GET http://localhost:8081/ 404 (Not Found)        localhost/:1 

Refused to load the image 'http://localhost:8081/favicon.ico' because it violates the following Content Security Policy directive: "default-src 'none'". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback.            localhost/:1

Я новичок в программировании и был бы признателен, если вы проясните, что не так. Я не могу распознать, где находятся коды отправки и получения в С ++, так как он сильно отличается от JavaScript. Итак, как я могу просто создать простую коммуникацию, где я хочу отправить только массив из c ++ в индекс. js?

1 Ответ

1 голос
/ 06 августа 2020

Ваш подход не может работать из-за путаницы между socket.io , который является протоколом, определенным для работы с другими клиентами или серверами socket.io, и необработанным TCP-сокетом, созданным на C ++, который будет работать с другими сокетами TCP.

То, что вы создаете в коде C ++, - это сокет TCP, который, к сожалению, не имеет ничего общего с тем, что использует socket.io. Socket.io обеспечивает связь с использованием потоковой передачи HTTP или WebSocket (другого протокола), где это возможно.

Здесь - это пример библиотеки C ++, которая, кажется, реализует протокол socket.io. Сам никогда не пользовался, но похоже это то, что вы ищете. Попробуйте использовать это на стороне C ++ или реализовать сокет raw tcp на стороне node.js. Эта библиотека может хорошо подойти для этого.

Я рекомендую этот учебник , чтобы вы начали с основ реализации взаимодействия клиент-сервер на чистом C ++, тогда вы можете go оттуда, чтобы понять, как создать клиента в nodejs.

...