gpt4 book ai didi

node.js - 与 node.js 子进程共享 UDP 套接字/端口

转载 作者:太空宇宙 更新时间:2023-11-03 22:39:11 24 4
gpt4 key购买 nike

使用 Node.js 集群共享 TCP 套接字/端口很容易,但使用 UDP dgram 似乎不可能做到这一点。

有没有办法使用集群、通过在进程或其他进程之间共享文件描述符来做到这一点?

最佳答案

我在这方面遇到了很多问题,因为 Node.js 并不是真正的“fork”,它是“spawns”或“fork/execs”。当我将集群用于 UDP 服务器时,只有一个子进程会接收数据包,即最后一个进程。如果您只是“fork()”,操作系统会将传入的数据包轮询到每个子级。如果你“spawn()”,你会遇到文件/套接字句柄的继承权问题,必须设置选项等,并且底层的node.js udp服务器可能没有应用这些选项。

我必须编写自己的扩展,简单地调用底层操作系统 fork() 并使其像普通的 fork 网络服务器一样工作。

Windows 没有 fork(),所以这种方法不起作用,这可能就是为什么 Node.js 没有普通的、简单的、花园式的 fork() 的原因。这样做会导致它无法移植到 Windows。

1)创建一个目录,我将其命名为“util”。

2)将这两个文件放入该目录中。

--------------------切到这里,将以下名称命名为“util.cc”--------

#include <v8.h>    //needed for extension infrastructure
#include <node.h> //needed for extension infrastructure

#include <iostream> // not part of extension infrastructure, just for the code I'm adding and only while developing to output debugging messages

using namespace node;
using namespace v8;

// The following two functions are examples of the minimum required for a node.js extension that does anything

static Handle<Value> spoon(const Arguments& args)
{
pid_t rval = fork();
if (rval < 0)
{
return ThrowException(Exception::Error(String::New("Unable to fork daemon, pid < 0.")));
}
Handle<Value> n = v8::Number::New(rval);
return n;
}

static Handle<Value> pid(const Arguments& args)
{
pid_t rval = getpid();
Handle<Value> n = v8::Number::New(rval);
return n;
}

extern "C" void init(Handle<Object> target)
{
NODE_SET_METHOD(target, "fork", spoon);
NODE_SET_METHOD(target, "pid", pid);
}

--------切到这里,将以下命名为“wscript”--------

def set_options(opt):
opt.tool_options("compiler_cxx")

def configure(conf):
conf.check_tool("compiler_cxx")
conf.check_tool("node_addon")

def build(bld):
obj = bld.new_task_gen("cxx", "shlib", "node_addon")
obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall"]
obj.target = "util"
obj.source = "util.cc"

---------切割结束,别再用刀具了------

3)运行“node-waf配置”

如果一切顺利的话,

4) 运行“node-waf”

5) 将创建一个名为“build”的新目录,并且将创建您的扩展“build/default/util.node”。将其复制到任何位置并在 Node 程序中使用它,例如:

var util = require("util.node");

var pid = util.fork();

其中还包含一个 util.pid() 函数,因为 process.pid 在 fork 后无法立即工作。它提供父进程的 pid。

我是一名初学者 Node 扩展编写者,所以如果这是一种幼稚的方法,哦,好吧,但到目前为止它对我很有帮助。任何改进,如“简化”,我们将不胜感激。

关于node.js - 与 node.js 子进程共享 UDP 套接字/端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12495175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com