Node.js v0.11.11 マニュアル & ドキュメンテーション
Table of Contents
- UDP / Datagram Sockets
- dgram.createSocket(type, [callback])
- Class: dgram.Socket
- Event: 'message'
- Event: 'listening'
- Event: 'close'
- Event: 'error'
- socket.send(buf, offset, length, port, address, [callback])
- socket.bind(port, [address], [callback])
- socket.close()
- socket.address()
- socket.setBroadcast(flag)
- socket.setTTL(ttl)
- socket.setMulticastTTL(ttl)
- socket.setMulticastLoopback(flag)
- socket.addMembership(multicastAddress, [multicastInterface])
- socket.dropMembership(multicastAddress, [multicastInterface])
- socket.unref()
- socket.ref()
UDP / Datagram Sockets#
Stability: 3 - Stable
データグラムソケットは require('dgram') で利用可能になります。
重要な注意: dgram.Socket#bind() の振る舞いは v0.10 で変更され、
それは常に非同期になりました。
もし次のようなコードがあると:
var s = dgram.createSocket('udp4');
s.bind(1234);
s.addMembership('224.0.0.114');
これは次のように変更されなければなりません。
var s = dgram.createSocket('udp4');
s.bind(1234, function() {
s.addMembership('224.0.0.114');
});
dgram.createSocket(type, [callback])#
typeString. 'udp4' または 'udp6' のいずれかcallbackFunction.'message'イベントのリスナとして割り当てられる、 Optional- Returns: Socket object
指定された種類のデータグラムソケットを作成します。
妥当な種類は udp4 と udp6です。
オプションのコールバックは message イベントのリスナーとして加えられます。
データグラムを受信したい場合は socket.bind() を呼び出します。
socket.bind() は「全てのインタフェース」のアドレスにランダムなポート
(udp4 と udp6 ソケットの両方で正しいものです) をバインドします。
そのアドレスとポートは socket.address().address および
socket.address().port で取得することができます。
Class: dgram.Socket#
dgram Scoket クラスはデータグラム機能をカプセル化します。
それは dgram.createSocket(type, [callback]) を通じて生成されます。
Event: 'message'#
msgBuffer object. メッセージrinfoObject. リモートアドレスの情報
ソケット上で新しいデータグラムが到着した時に生成されます。
msg は Buffer で、rinfo は送信者のアドレス情報を持ったオブジェクトです。
socket.on('message', function(msg, rinfo) {
console.log('Received %d bytes from %s:%d\n',
msg.length, rinfo.address, rinfo.port);
});
Event: 'listening'#
ソケットでデータグラムの待ち受けを開始すると生成されます。 これは UDP ソケットが作成されるとすぐに発生します。
Event: 'close'#
close() によってソケットがクローズすると生成されます。
このソケットでは新しい message イベントは生成されなくなります。
Event: 'error'#
exceptionError object
エラーが発生すると生成されます。
socket.send(buf, offset, length, port, address, [callback])#
bufBuffer オブジェクトまたは文字列。送信されるメッセージoffsetInteger。メッセージの開始位置となるバッファ内のオフセットlengthInteger。メッセージのバイト長port整数。接続先のポート番号。address文字列。接続先のホスト名または IP アドレス。callback関数。メッセージが送信されるとコールバックされる。任意。
UDP ソケットに対しては、相手先のポートとアドレスは必ず指定しなければなりません。
address パラメータに文字列を提供すると、それは DNS によって解決されます。
アドレスが省略された場合や空文字列だった場合は、代わりに '0.0.0.0' または
'::0' が使われます。ネットワークの構成によっては、これらのデフォルト値は
動作したりしなかったりします; 相手先のアドレスは明示的に指定することが最適です。
ソケットが以前に bind の呼び出しによってバインドされていない場合は、
ランダムなポート番号が「全てのインタフェース」アドレスに対してバインドされます
(udp4 ソケットでは 0.0.0.0、udp6 では ::0)。
DNS におけるエラー検出と、buf が再利用可能になったことを安全に知るために、
オプションのコールバックを指定することができます。
DNS ルックアップは送信を少なくとも次のイベントループまで遅らせることに
注意してください。
データグラムの送信が行われたことを確実に知る唯一の手段は、
コールバックを使うことです。
マルチバイト文字を考慮してください。
offset および length は文字の位置ではなく、
バイト位置
に関係します。
localhost の適当なポートに UDP パケットを送信する例;
var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost", function(err) {
client.close();
});
UDP データグラムのサイズについて
IPv4/v6 データグラムの最大のサイズは MTU (Maximum Transmission Unit) と、
Payload Length フィールドサイズに依存します。
Payload Lengthフィールドサイズは 16bit 長で、これは通常のペイロードが IP ヘッダとデータ含めて 64K オクテットより長くなれないことを意味します (65,507 バイト = 65,535 − 8 バイトの UDP ヘッダ − 20 バイトの IP ヘッダ); これは一般的にループバックインタフェースでは正しいものの、 ほとんどのホストとネットワークにとって長大なデータグラムは 現実的ではありません。MTUはリンク層により大きなサイズを与える技術で、 データグラムもサポートできます。 どんなリンクでも、それらが全体として到着するか断片化されるかに関わらず、IPv4は最低69オクテット必要で、推奨されるIPv4のMTUは576です (典型的なダイヤルアップ型アプリケーションのMUT推奨値)。IPv6では最小のMTUは1280オクテットですが、フラグメントを再構築する バッファサイズは最低1500オクテットが必要です。68オクテットはとても小さいので、もっとも現代的なリンク層技術では、 最小のMTUは1500です (イーサネットと同じです)。
パケットが通過する各リンクの MTU をあらかじめ知ることは
できないこと、(受信側の) MTU より大きなデータグラムを送信しても
通常は動作しないことに注意してください
(パケットは送り主に知らされることなく黙って捨てられ、
意図した受信者に到達することはありません)。
socket.bind(port, [address], [callback])#
portIntegeraddressString、任意callback引数のない関数、任意。バインディングが終了した時に コールバックされます。
UDP ソケット用です。port とオプションの address でデータグラムを
待ち受けます。
address が指定されなければ、OS は全てのアドレスからの待ち受けを試みます。
バインディングが完了すると、'listening' イベントが生成され、
(もし指定されていれば) callback が呼び出されます。
'listening' イベントリスナと callback の両方を指定しても有害ではありませんが
あまり役には立ちません。
束縛されたデータグラムソケットはデータグラムを受信するために node プロセスの 実行を維持し続けます。
バインディングが失敗すると、'error' イベントが生成されます。
まれなケース (たとえばクローズしたソケットへのバインディング) では、
このメソッドは Error をスローすることがあります。
41234 番ポートを待ち受ける UDP サーバの例:
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
server.on("error", function (err) {
console.log("server error:\n" + err.stack);
server.close();
});
server.on("message", function (msg, rinfo) {
console.log("server got: " + msg + " from " +
rinfo.address + ":" + rinfo.port);
});
server.on("listening", function () {
var address = server.address();
console.log("server listening " +
address.address + ":" + address.port);
});
server.bind(41234);
// server listening 0.0.0.0:41234
socket.close()#
下層のソケットをクローズし、データの待ち受けを終了します。
socket.address()#
オブジェクトが持っているソケットのアドレス情報を返します。
このオブジェクトは address、port、そして family を持っています。
socket.setBroadcast(flag)#
flagBoolean
ソケットのオプション SO_BROADCAST を設定またはクリアします。
このオプションが設定されると、UDP パケットはローカルインタフェースのブロードキャスト用アドレスに送信されます。
socket.setTTL(ttl)#
ttlInteger
ソケットオプションの IP_TTL を設定します。
TTL は「生存期間」を表しますが、このコンテキストではパケットが通過を許可される IP のホップ数を指定します。
各ルータまたはゲートウェイはパケットを送出する際 TTL をデクリメントします。
ルータによって TTL がデクリメントされて 0 になるとそれは送出されません。
TTL 値の変更は通常、ネットワークの調査やマルチキャストで使われます。
setTTL() の引数は 1 から 255 のホップ数でです。ほとんどのシステムでデフォルトは 64 です。
socket.setMulticastTTL(ttl)#
ttlInteger
IP_MULTICAST_TTL ソケットオプションを設定します。
TTL は「生存期間」を表しますが、この文脈では特にマルチキャストのトラフィックにおいてパケットが通過できるIPホップの数を指定します。
それぞれのルーターまたはゲートウェイは、パケットを転送する際に TTL をデクリメントします。
TTL がルーターによって 0 までデクリメントされると、それは転送されません。
setMulticastTTL() の引数はホップを表す数値で、0 から 255 の間です。
ほとんどのシステムでデフォルトは 1 です。
socket.setMulticastLoopback(flag)#
flagBoolean
IP_MULTICAST_LOOP ソケットオプションを設定またはクリアします。
このオプションが設定されると、マルチキャストのパケットはローカルインタフェースでも受信できるようになります。
socket.addMembership(multicastAddress, [multicastInterface])#
multicastAddressStringmulticastInterfaceString, Optional
IP_ADD_MEMBERSHIP ソケットオプションを設定し、マルチキャストグループに参加することをカーネルに伝えます。
multicastInterface が指定されなかった場合は、全ての妥当なインタフェースをメンバーシップに加えようとします。
socket.dropMembership(multicastAddress, [multicastInterface])#
multicastAddressStringmulticastInterfaceString, Optional
addMembership の反対です - IP_DROP_MEMBERSHIP ソケットオプションによって、マルチキャストグループから抜けることをカーネルに伝えます。
これはソケットのクローズ時やプロセスの終了時にカーネルによって自動的に呼び出されるため、ほとんどのアプリケーションはこれを呼び出す必要がありません。
multicastInterface が指定されなかった場合は、全ての妥当なインタフェースをメンバーシップから削除しようとします。
socket.unref()#
イベントシステムにおいて、このソケットだけがアクティブな場合にプログラムを
終了することができるように、unref を呼び出します。
既に unref されたソケットで再び unref が呼び出されても影響はありません。
socket.ref()#
unref とは逆に、以前に unref されたソケットが唯一残ったソケットになっても、
プログラムが終了 (デフォルトの動作です) しないように、ref を呼び出します。
既に ref されたソケットで再び ref が呼び出されても影響はありません。