2

node.js クラスターを使用すると TCP ソケット/ポートを共有するのは簡単ですが、UDP dgram ではこれを行うことはできないようです。

クラスターを使用するか、プロセス間でファイル記述子を共有するか、その他の方法でこれを行う方法はありますか?

4

2 に答える 2

0

node.jsは実際には「フォーク」ではなく、「スポーン」または「フォーク/エグゼクティブ」であるため、これに関して多くの問題が発生しました。UDPサーバーにクラスターを使用した場合、子プロセスの1つだけがパケットを受信し、最後の1つがバインドされました。単に「fork()」を実行すると、OSラウンドは着信パケットを各子にロビンします。「spawn()」を実行すると、ファイル/ソケットハンドルで継承権の問題が発生し、オプションを設定する必要があります。基盤となるnode.jsudpサーバーがそれらのオプションを適用していない可能性があります。

基盤となるOSfork()を呼び出すだけの独自の拡張機能を作成し、通常のフォークであるネットワークサーバーのように機能させる必要がありました。

Windowsにはfork()がないため、このアプローチは機能しません。おそらく、node.jsに通常のプレーンなガーデンバラエティfork()がないのはそのためです。そうすると、Windowsに移植できなくなります。

1)ディレクトリを作成します。私は「util」と呼びました。

2)これら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-wafconfigure」を実行します

それがうまくいけば、

4)「node-waf」を実行します

5)「build」という新しいディレクトリが作成され、拡張機能「build / default/util.node」が作成されます。それをどこにでもコピーして、次のようにノードプログラム内から使用します。

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

var pid = util.fork();

フォーク直後はprocess.pidが機能しないため、util.pid()関数も含まれています。親プロセスのpidを提供します。

私は初心者のノード拡張ライターなので、これが素朴なアプローチであれば、まあ、それは今のところ私に役立っています。「簡略化」のような改善があれば大歓迎です。

于 2012-12-28T23:09:15.943 に答える
0

この問題は node.js v0.10 で解決されました

于 2013-07-12T20:49:23.333 に答える