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



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

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

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

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

Windows没有fork(),所以这种方法不起作用,这可能就是为什么node.js没有一个普通的、简单的、花园式的分叉()的原因。这样做会使它无法移植到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) 运行"节点waf配置">

如果进展顺利,

4) 运行"节点waf">

5) 将创建一个名为"build"的新目录,并创建扩展名"build/default/util.node"。将其复制到任何地方,并在您的节点程序中使用,如:

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

var pid=util.fuck();

中还包含一个util.pid()函数,因为process.pid在分叉后无法正常工作。它提供父进程的pid。

我是一个节点扩展的初学者,所以如果这是一个天真的方法,哦,好吧,但到目前为止,它对我很有用。任何改进,如"简化",我们将不胜感激。

此问题已在node.js v0.10 中解决

最新更新