前言
在網路程式設計中,通過廣播和多播可以實現傳送端傳送乙個資料報,有多個接收端接收的情況。
廣播
由於tcp是有連線的,所以不能用來傳送廣播訊息。傳送廣播訊息,必須用到udp,udp可以不用建立連線而傳送訊息。廣播訊息的目的ip位址是一種特殊ip位址,稱為廣播位址。廣播位址由ip位址網路字首加上全1主機字尾組成,如:192.168.1.255是192.169.1.0這個網路的廣播位址;130.168.255.255是130.168.0.0這個網路的廣播位址。向全部為1的ip位址(255.255.255.255)傳送訊息的話,那麼理論上全世界所有的聯網的計算機都能收得到了。但實際上不是這樣的,一般路由器上設定拋棄這樣的包,只在本地網內廣播,所以效果和向本地網的廣播位址傳送訊息是一樣的。
c#中傳送廣播訊息的過程如下,注意要呼叫setsockoption函式,不然要丟擲異常:
socket sock = new socket(addressfamily.internetwork, sockettype.dgram,
protocoltype.udp);
ipendpoint iep1 = new ipendpoint(ipaddress.broadcast, 9050);
ipendpoint iep2 = new ipendpoint(ipaddress.parse("192.168.1.255"), 9050);
string hostname = dns.gethostname();
byte data = encoding.ascii.getbytes(hostname);
sock.setsocketoption(socketoptionlevel.socket,
socketoptionname.broadcast, 1);
sock.sendto(data, iep1);
sock.sendto(data, iep2);
sock.close();c#中接收廣播訊息的過程如下,沒有什麼特別的:
socket sock = new socket(addressfamily.internetwork,
sockettype.dgram, protocoltype.udp);
ipendpoint iep = new ipendpoint(ipaddress.any, 9050);
sock.bind(iep);
endpoint ep = (endpoint)iep;
console.writeline("ready to receive…");
byte data = new byte[1024];
int recv = sock.receivefrom(data, ref ep);
string stringdata = encoding.ascii.getstring(data, 0, recv);
console.writeline("received: from: ",
stringdata, ep.tostring());
data = new byte[1024];
recv = sock.receivefrom(data, ref ep);
stringdata = encoding.ascii.getstring(data, 0, recv);
console.writeline("received: from: ",
stringdata, ep.tostring());
sock.close();
attentions:
1 廣播可以由客戶程式來通知子網內的服務程式,自己的位置。2 傳送廣播訊息時指定的埠也是有作用的,接收端的udp socket如果bind到此介面的話,就能夠接收到訊息。(如果不bind的話,就能接收所有埠的訊息??)
3 接收端接到的包中顯示的遠端ip位址是傳送端的位址。就是說廣播位址不會顯示到乙個包的源ip位址位置(loopback位址不會顯示到包的目的ip位址位置)
4 可以用執行緒不停地傳送和接收廣播訊息,確認兩端的位置和證明自己的存在
C 廣播程式
前言 在網路程式設計中,通過廣播和多播可以實現傳送端傳送乙個資料報,有多個接收端接收的情況。廣播 由於tcp 是有連線的,所以不能用來傳送廣播訊息。傳送廣播訊息,必須用到 udp,udp可以不用建立連線而傳送訊息。廣播訊息的目的 ip位址是一種特殊 ip位址,稱為廣播位址。廣播位址由 ip位址網路字...
C 廣播通訊
單播 點對點 通訊,即網路中單一的源節點傳送封包到單一的上的節點。在廣播通訊中,網路層提供了將封包從乙個節點傳送到所有其他節點的服務。利用廣播 broadcast 可以將資料傳送給本地子網上的每個機器。廣播的缺點是如果多個程序都傳送廣播資料,網路就會阻塞。1.服務端 using system usi...
有序廣播,粘性廣播
1.註冊多個receiver,要同時使用同乙個action,設定priority來指定優先順序。2.傳送有序廣播 sendorderedbroadcast intent,null intent intent newintent www.wangpeng intent.putextra name 我是...