【发布时间】:2021-06-15 07:01:47
【问题描述】:
我有一台机器同时运行一些 C++ 应用程序 和一个 Node.js 服务器。
用例: 我希望能够触发我的 C++ 应用程序并使其将一些数据(比如说一个字符串)传递到一个套接字文件中。然后我的 Node.js 服务器将从套接字中获取该数据并通过 TCP 端口将其打印在某个网页上(此处/尚未包含代码)。反过来也一样。
到目前为止我做了什么:
我能够使用以下代码将我的 Node.js 服务器 中的一些字符串写入套接字文件:
server.js
var net = require('net');
var fs = require('fs');
var socketPath = '/tmp/sock';
fs.stat(socketPath, function(err) {
if (!err) fs.unlinkSync(socketPath);
var unixServer = net.createServer(function(localSerialConnection) {
localSerialConnection.on('data', function(data) {
// data is a buffer from the socket
console.log('Something happened!');
});
// write to socket with localSerialConnection.write()
localSerialConnection.write('HELLO\n');
localSerialConnection.write('I\'m\n');
localSerialConnection.write('DOING something!\n');
localSerialConnection.write('with the SOCKS\n');
});
unixServer.listen(socketPath);
});
使用nc -U /tmp/sock 读取内容并使用以下输出https://i.stack.imgur.com/ye2Dx.png。
当我运行我的 C++ 代码时:
cpp_socket.cpp
#include <boost/asio.hpp>
#include <iostream>
int main() {
using boost::asio::local::stream_protocol;
boost::system::error_code ec;
::unlink("/tmp/sock"); // Remove previous binding.
boost::asio::io_service service;
stream_protocol::endpoint ep("/tmp/sock");
stream_protocol::socket s(service);
std::cout << "passed setup section" << std::endl;
s.connect(ep);
std::cout << "passed connection" << std::endl;
std::string message = "Hello from C++!";
std::cout << "before sending" << std::endl;
boost::asio::write(s, boost::asio::buffer(message), boost::asio::transfer_all());
/* s.write_some(boost::asio::buffer("hello world!"), ec); */
std::cout << "after sending" << std::endl;
我得到以下输出:
/cpp_socket
passed setup section
terminate called after throwing an instance of 'boost::wrapexcept<boost::system::system_error>'
what(): connect: No such file or directory
Aborted (core dumped)
即使/tmp/sock 文件仍然存在。
当我使用 cmets 删除 ::unlink("/tmp/sock"); // Remove previous binding. 时,它会运行,但我的 Node.js 服务器停止运行并且 nc -U /tmp/sock 失去连接。
.write() 和 .write_some() 函数似乎都不起作用。
我假设我错过了一些琐碎的事情,或者我没有遵循 unix 套接字通信的基本概念。
问题:
- 甚至可以使用一个 Node.js 服务器应用程序同时侦听 TCP 端口和 UNIX 套接字吗?
- 从我的输入来看,我是否正确理解了 unix 套接字通信的概念?
- 我如何read 或 write 从 C++ 从/到套接字,最好使用 C++ boost/asio 库。但不一定是必要的:-)
- 我问对问题了吗?
如您所见,我对这些主题并没有太多经验。如果我没有相应地解决我的问题并且不够准确,那是由于我缺乏经验。
提前非常感谢。让我们进行富有成果的讨论。
【问题讨论】:
-
为什么不直接使用普通的socket连接本地主机呢?或者把那个 c++ 程序变成一个 node.js 原生模块?
-
一个服务器应用程序可以同时监听多个 TCP 端口吗?谢谢!
-
@SomeLoneDevMan 当然
-
@SomeLoneDevMan 是的,只需创建一个数组并多次调用 .listen( 端口号 ) 即可。
-
是的。说得通。但它仍然困扰着我,无法通过本地套接字进行通信。我尝试了很多很多方法。谢谢!!!
标签: c++ node.js ipc boost-asio unix-socket