首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++和node.js之间建立套接字通信的困难(服务器)

在c++和node.js之间建立套接字通信的困难(服务器)
EN

Stack Overflow用户
提问于 2020-08-06 15:45:01
回答 1查看 703关注 0票数 1

我试图在c++和node.js服务器之间构建一个套接字通信。这是我的index.js代码:

代码语言:javascript
复制
'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++代码:

代码语言:javascript
复制
#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);
}

我的环境是Mac,我正在使用Xcode编译c++。我将节点与node index.js连接到本地主机,并编译和运行c++程序。但是,当我打开localhost:8081时,我在控制台中接收到此错误:

代码语言:javascript
复制
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

我对编程非常陌生,如果你能澄清问题所在,我将不胜感激。我无法识别c++中的发送和接收代码在哪里,因为它与JavaScript非常不同。那么,我如何才能构建一个简单的通信,只想从c++发送一个数组到index.js呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 16:05:19

您的方法无法工作,因为socket.io (它是定义用于处理其他socket.io客户端或服务器的协议)和C++中创建的原始TCP套接字(将用于其他socket.io套接字)之间造成了混淆。

您在C++代码中创建的是一个TCP套接字,遗憾的是,它与socket.io使用的内容无关。只要有Socket.io,就可以使用HTTP或WebSocket (另一种协议)进行通信。

这里是一个C++库的例子,它似乎实现了socket.io协议。我从来没有用过它,但它似乎是你正在寻找的东西。尝试在C++端使用它,或者在node.js端实现一个原始的tcp套接字。库可能非常适合这一点。

我建议使用本教程来帮助您了解在C++中实现客户机-服务器通信的基础知识,然后您可以从那里开始了解如何在nodejs中创建客户机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63287220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档