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

时间:2012-09-19 12:57:09

标签: node.js

使用node.js群集很容易共享TCP套接字/端口,但似乎无法使用UDP dgram执行此操作。

有没有办法使用集群,在进程之间共享文件描述符或其他?

2 个答案:

答案 0 :(得分:0)

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

我必须编写自己的扩展,只需调用底层的操作系统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 configure”

如果情况顺利,

4)运行“node-waf”

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

var util = require(“util.node”);

var pid = util.fork();

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

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

答案 1 :(得分:0)

此问题已在node.js v0.10

中得到解决