dgram 數(shù)據(jù)報

2018-07-11 10:00 更新

要使用數(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.

當一個SOCKET 接收到一個新的數(shù)據(jù)包的時候觸發(fā)此事件, msg 是緩沖區(qū)變量,rinfo 是一個包含了發(fā)送者地址 信息以及數(shù)據(jù)報字節(jié)長度的對象.

Event: 'listening'

function () { }

當一個SOCKET 開始監(jiān)聽數(shù)據(jù)報的時候觸發(fā),當UDP SOCKET 建立后就會觸發(fā)這個事件。而UNIX DOMAIN SOCKET 直到在SOCKET 上調(diào)用了bind()方法才會觸發(fā)這個消息.

Event: 'close'

function () { }

當一個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 來說,他的目標地址是一個使用文件系統(tǒng)表示的路徑名,callback 作為一個可選 項會在系統(tǒng)調(diào)用sendto 完畢后被觸發(fā)。除非callback 被觸發(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 來說,目標端口和IP 地址是必須要指定的,可以用字符串來指定地址參數(shù),并且這個參數(shù) 是可以通過DNS 解析的,CALLBACK 作為可選項可以檢測到任何DNS 錯誤和是否BUF 重復使用了.請記住 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ù)包服務器來做接受信息回顯的例子:

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 客戶端與服務器交互的例子

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 服務器的例子

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)

設置或者清除SO_BROADCAST 選項,當這個選項設置后,UDP 包可以發(fā)送到本地接口的廣播地址。

dgram.setTTL(ttl)

設置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)常用來當網(wǎng)絡探針或者作為數(shù)據(jù)多播使用 ttl 用來設置HOPS 的數(shù)值從1到255,大多數(shù)系統(tǒng)缺省會設置為64


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號