要使用數(shù)據(jù)包SOCKET 需要調(diào)用require('dgram'),數(shù)據(jù)報一般用來處理IP/UDP 信息,但是數(shù)據(jù)報也可用在UNIX DOMAIN SOCKETS 上
Event: 'message' function (msg, rinfo) { } Emitted when a new datagram is available on a socket. msg is a Buffer and rinfo is an object with the sender's address information and the number of bytes in the datagram.
當(dāng)一個SOCKET 接收到一個新的數(shù)據(jù)包的時候觸發(fā)此事件, msg 是緩沖區(qū)變量,rinfo 是一個包含了發(fā)送者地址 信息以及數(shù)據(jù)報字節(jié)長度的對象.
Event: 'listening'
function () { }
當(dāng)一個SOCKET 開始監(jiān)聽數(shù)據(jù)報的時候觸發(fā),當(dāng)UDP SOCKET 建立后就會觸發(fā)這個事件。而UNIX DOMAIN SOCKET 直到在SOCKET 上調(diào)用了bind()方法才會觸發(fā)這個消息.
Event: 'close'
function () { }
當(dāng)一個SOCKET 使用close()方法關(guān)閉時觸發(fā)此事件.在此事件之后此SOCKET 不會有任何消息事件被觸發(fā).
dgram.createSocket(type, [callback])
建立一個指定類型的數(shù)據(jù)報SOCKET,有效類型有:udp4,udp6,unix_dgram callback 作為一個可選項,可作為message 事件的監(jiān)聽器被加入。
dgram.send(buf, offset, length, path, [callback])
對于unix domain datagram xockets 來說,他的目標(biāo)地址是一個使用文件系統(tǒng)表示的路徑名,callback 作為一個可選 項會在系統(tǒng)調(diào)用sendto 完畢后被觸發(fā)。除非callback 被觸發(fā),否則重復(fù)使用buf 是很不安全的。要注意除非這 個socket 已經(jīng)使用bind()方法綁定到一個路徑名上,否則這個SOCKET 無法接收到任何信息。
下面是一個通過unix domain socket /var/run/syslog 發(fā)送消息到syslogd 的例子:
var dgram = require('dgram'),
message = new Buffer("A message to log.");
client = dgram.createSocket("unix_dgram");
client.send(message, 0, message.length, "/var/run/syslog",
function (err, bytes) {
if (err) {
throw err;
}
console.log("Wrote " + bytes + " bytes to socket.");
});
從MESSAGE 中偏移為0的地方開始,長度為MESSAGE.LENGTH 的這些內(nèi)容通過/var/run/syslog 發(fā)送系統(tǒng)調(diào) 用發(fā)送后,將調(diào)用CALLBACK,如果有錯誤則拋出異常,否則console.log 實際發(fā)送了多少個字節(jié)。
dgram.send(buf, offset, length, port, address, [callback])
對于UDPSOCKETS 來說,目標(biāo)端口和IP 地址是必須要指定的,可以用字符串來指定地址參數(shù),并且這個參數(shù) 是可以通過DNS 解析的,CALLBACK 作為可選項可以檢測到任何DNS 錯誤和是否BUF 重復(fù)使用了.請記住 DNS 搜索將會使SEND 動作最少延遲到下一個執(zhí)行時間片發(fā)生, ,唯一能確定已經(jīng)SEND 得方法是使用 CALLBACK
下面是一個發(fā)送UDP 數(shù)據(jù)包到本機一個隨機端口的例子
var dgram = require('dgram'),
message = new Buffer("Some bytes");
client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost");
client.close();
dgram.bind(path)
只有在Unxi DOMAIN DATAGRAM SOCKET 中使用,開始在一個指定路徑上監(jiān)聽一個SOCKET 過來的的數(shù)據(jù) 報。要記得,客戶端可以不是用BIND()方法而直接調(diào)用SEND()方法,但是不使用BIND()方法是無法接收到任 何信息的。
下面是一個使用UNIX DOMAIN 數(shù)據(jù)包服務(wù)器來做接受信息回顯的例子:
var dgram = require("dgram");
var serverPath = "/tmp/dgram_server_sock";
var server = dgram.createSocket("unix_dgram");
server.on("message", function (msg, rinfo) {
console.log("got: " + msg + " from " + rinfo.address);
server.send(msg, 0, msg.length, rinfo.address);
});
server.on("listening", function () {
console.log("server listening " + server.address().address);
})
server.bind(serverPath);
下面是一個UNIX DOMAIN DATAGRAM 客戶端與服務(wù)器交互的例子
var dgram = require("dgram");
var serverPath = "/tmp/dgram_server_sock";
var clientPath = "/tmp/dgram_client_sock";
var message = new Buffer("A message at " + (new Date()));
var client = dgram.createSocket("unix_dgram");
client.on("message", function (msg, rinfo) {
console.log("got: " + msg + " from " + rinfo.address);
});
client.on("listening", function () {
console.log("client listening " + client.address().address);
client.send(message, 0, message.length, serverPath);
});
client.bind(clientPath);
dgram.bind(port, [address])
對于UDP SOCKETS,這個方法會在指定端口和可選地址上監(jiān)聽,如果地址沒有指定,則系統(tǒng)會嘗試監(jiān)聽所有 有效地址。
下面是一個監(jiān)聽在41234端口的UDP 服務(wù)器的例子
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
var messageToSend = new Buffer("A message to send");
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
dgram.close()
這個方法關(guān)閉非延遲的SOCKET 并且停止在其上監(jiān)聽數(shù)據(jù)。即使沒有調(diào)用BIND()方法UDP SOCKET 也會自動 監(jiān)聽消息。
dgram.address()
返回包含SOCKET 地址信息的一個對象,對于UDP SOCKETS 來說,這個對象將包含地址和端口,對于UNIX DOMAIN SOCKETS 來說,這個對象僅包含地址。
dgram.setBroadcast(flag)
設(shè)置或者清除SO_BROADCAST 選項,當(dāng)這個選項設(shè)置后,UDP 包可以發(fā)送到本地接口的廣播地址。
dgram.setTTL(ttl)
設(shè)置IP_TTL 這個選項,TTL 表示“存活時間”,但是在這個上下文環(huán)境中,他也可以指定IP 的HOPS(每個節(jié) 點在轉(zhuǎn)發(fā)數(shù)據(jù)包時的消耗。如果Hop limit 消耗到0,則取消數(shù)據(jù)包)來確定一個數(shù)據(jù)包大致允許經(jīng)過多少節(jié)點。 每經(jīng)過個路由器或者網(wǎng)關(guān)都會減少TTL 數(shù)值,如果TTL 被一個路由器減少到0,這個數(shù)據(jù)報將不會繼續(xù)轉(zhuǎn)發(fā), 修改TTL 數(shù)值經(jīng)常用來當(dāng)網(wǎng)絡(luò)探針或者作為數(shù)據(jù)多播使用 ttl 用來設(shè)置HOPS 的數(shù)值從1到255,大多數(shù)系統(tǒng)缺省會設(shè)置為64
更多建議: