Node dgram模組實現UDP通訊

2021-08-08 18:52:43 字數 3813 閱讀 4676

這裡簡單介紹下,udp,即使用者資料報協議,一種面向無連線的傳輸層協議,提供不可靠的訊息傳送服務。udp協議使用埠號為不同的應用保留其各自的資料傳輸通道,這一點非常重要。與tcp相比,占用資源更少,傳輸速度更快。

向主機192.168.10.2的8060埠傳送資料報,該ip資料報目標ip在乙太網中被arp解析成mac位址,然後將此mac位址設定為目標位址發出去。

該子網下的主機乙太網介面看到該資料幀時,對比自己的mac位址,如果不一樣,則忽略該資料幀。

直到192.168.10.2主機看到該資料幀時,發現mac一致,則讀入該資料幀,然後在ip層對比目標ip和本機ip,在udp層對比埠號是否一致,最後接收該資料幀。

向192.168.10.255主機埠為8060傳送資料報,,該ip資料報目標ip在乙太網中被arp解析成mac位址,然後將此mac位址設定為目標位址發出去。

192.168.10.2和192.168.10.3的主機介面都會和此廣播位址匹配成功,直到該資料報進入傳輸層時根據埠是否匹配判斷是否丟棄該資料,埠為8060的會保留該資料,否則將資料丟棄。

該模組用來建立udp資料報socket,繼承了eventemitter,該模組的api如下所示:

服務端:

const dgram = require("dgram"),

server = dgram.createsocket("udp4");

server.on

("close", () => )

server.on

("error", (err) => )

server.on

("listening", () => )

server.on

("message", (msg, rinfo) => :$-$`);

server.send(`welcome $:$`, rinfo.port, rinfo.address);

settimeout(function () , 2000);

})server.bind

(8060)

客戶端:

const dgram = require("dgram"),

client = dgram.createsocket("udp4");

client.on

("close", () => )

client.on

("error", (err) => )

client.on

("listening", () => )

client.on

("message", (msg, rinfo) =>

console.log(`message from server $:$-$`);

})client.send

(`hello`,8060,'127.0.0.1');

要實現udp廣播,就必須知道廣播位址,廣播位址如何計算呢?可以利用ipconfig(windows)或ifconfig(*unix)得到ip位址和mask掩碼位址,然後利用ip位址與mask子網掩碼做與操作得到網路位址,網路位址中主機位都為1就是廣播位址,舉個例子:

接著實現udp廣播,我機子的ip為192.168.0.193,掩碼為255.255.255.0,因此廣播位址為192.168.0.255,服務端向廣播位址的8061埠傳送資料報,客戶端繫結本機的8061埠,如下所示:

服務端:

const dgram = require("dgram"),

server = dgram.createsocket("udp4");

server.on

("close", () => );

server.on

("listening", () => , 2000)

})server.on

("message", (msg, rinfo) => :$`);

})server.bind

(8060,"192.168.0.193");

客戶端:

const dgram = require("dgram"),

client = dgram.createsocket("udp4");

client.on

("close",()=>)

client.on

("error",err=>)

client.on

("listening",()=>)

client.on

("message",(msg,rinfo)=>`);

})client.bind

(8061,"192.168.0.193")

組播位址是實現udp組播的關鍵,因此了解組播位址是重點。什麼是組播位址?iana將d類位址

(224.0.0.0-239.255.255.255)分配給ip組播,用來標識乙個ip組播組,由igmp(組管理協議)協議維護組成員關係,其中:

224.0.0.0~224.0.0.255為永久組位址,位址224.0.0.0保留不做分配,其它位址供路由協議使用;

224.0.1.0~224.0.1.255是公用組播位址,可以用於internet;

224.0.2.0~238.255.255.255為使用者可用的組播位址(臨時組位址),全網範圍內有效;

239.0.0.0~239.255.255.255為本地管理組播位址,僅在特定的本地範圍內有效。 向組播位址傳送資料報,只有該組成員才會接收此資料報。

dgram模組的addmembership()方法將socket加入組播組中,dropmembership()方法退出組播組。下面以組播位址224.100.100.100來實現udp組播,如下所示:

服務端:

const dgram = require('dgram'),

server = dgram.createsocket("udp4"),

multicastaddr = '224.100.100.100';

server.on("error",err=>)

server.on

('error',(err)=>);

server.on

("listening",()=>,1500)

})server.on

('message',(msg,rinfo)=>:$`);

});function

sendmsg

()server.bind

(8060);

客戶端:

const dgram = require("dgram"),

client = dgram.createsocket("udp4"),

multicastaddr = '224.100.100.100';

client.on

("close", () => )

client.on

("error", err => )

client.on

("listening", () => )

client.on

("message", (msg, rinfo) => `);

})client.bind

(8061)

segmentfault【node dgram模組實現udp通訊】同步更

報表匯出模組實現

匯出的方法至少有三種,第一種是利用excel支援html,直接利用控制項的rendercontrol 方法,將控制項的html 以excel型別輸出到客戶端 第二種利用excel的com介面庫來完成 第三種利用資料訪問物件來操作excel檔案,以達到匯出excel的效果。以下是第一種的方法。輸出 p...

Python selenium模組實現定位過程解析

selenuim模組定位方法 1,我們想要操作html頁面上的元素,首先必須要定位到這個元素上。每個元素都有他各自的屬性,比如id,name,class等,我們就通過這些屬性來定位元素。2,我們先開啟乙個網頁,按f12來獲取這個網頁的源 方便我們定位元素。from selenium import w...

Redis Zset實現統計模組

檢視總體配置的數量以及活躍的數量 檢視每一條配置的使用量 直接在mysql中count即可得到 實現方式有很多,經過選擇之後,選取了用redis的zset來實現 使用hashmap,當獲取到配置的使用,那配置的key獲取value加1即可 可能存在的問題,併發問題,集群中每個節點的資料怎麼聚合 在m...