C 實現任意源組播與特定源組播

2021-08-02 09:16:35 字數 2029 閱讀 8693

ip組播通訊需要乙個特殊的組播位址,ip組播位址是一組d類ip位址,範圍從224.0.0.0 到 239.255.255.255。其中還有很多位址是為特殊的目的保留的。224.0.0.0到224.0.0.255的位址最好不要用,因為他們大多是為了特殊的目的保持的(比如igmp協議)。

igmp是ip組播的基礎。在ip協議出現以後為了加入對組播的支援,igmp產生了。igmp所做的實際上就是告訴路由器,在這個路由器所在的子網內有 人對傳送到某乙個組播組的資料感興趣,這樣當這個組播組的資料到達後面,路由器就不會拋棄它,而是把他轉送給所有感興趣的客戶。假如不同子網內的a和b要 進行組播通訊,那麼位於ab之間的所有路由器必須都要支援igmp協議,否則ab之間不能進行通訊。

利用c#實現udp組播的基本步驟為:

(1)建立socket;

(2)socket和埠繫結;

(3)加入乙個組播組國;

(4)通過sendto / recvfrom進行資料的收發;

(5)關閉socket。

下面是簡單的示例:

(1)傳送示例:

ipaddress ip = ipaddress.parse("226.1.1.2");

socket s = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp);

s.setsocketoption(socketoptionlevel.ip, socketoptionname.multicasttimetolive, 1);

ipendpoint ipep = new ipendpoint(ip, 5000);

......

s.sendto(buff, buff.length, socketflags.none, ipep);

......

s.close();

(2)接收示例:

socket s = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp);

ipendpoint ipep = new ipendpoint(ipaddress.any, 5980);

s.bind(ipep);

s.setsocketoption(socketoptionlevel.ip, socketoptionname.addmembership,

new multicastoption(ipaddress.parse("226.1.1.2"), ipaddress.any));

......

s.receive(b, 4, socketflags.none);

......

s.close();

特定源組播(source specific multicast, ssm)提供給主機應用程式乙個「通道」抽象,每個通道擁有乙個源和多個接收者。組播源可以傳送乙個ip報文給ssm目的位址g,接受者可以加入通道(s,g)來接收該報文。ipv4位址範圍232/8已經被iana分配給ssm服務。使用c#實現特定源組播時,需要設定socketoption引數,具體設定如下:

byte membershipaddresses = new byte[12]; // 3 ips * 4 bytes (ipv4)

buffer.blockcopy(multicastip.getaddressbytes(), 0, membershipaddresses, 0, 4);    //組播位址

buffer.blockcopy(sourceip.getaddressbytes(), 0, membershipaddresses, 4, 4);       //組播源位址

buffer.blockcopy(localip.getaddressbytes(), 0, membershipaddresses, 8, 4);          //本地接收位址

socket.setsocketoption(socketoptionlevel.ip, socketoptionname.addsourcemembership, membershipaddresses);

C語言如何實現任意數相乘

基本思路 用int型陣列num的某一位乘以另外乙個int陣列num1的所有位,然後將值暫時放在int型陣列num2,陣列num從第零位開始乘,直到最後一位,每移動一位,陣列num2裡面的資料更新一次。任意兩個小於100位數相乘,修改max值可實現更大的數相乘 include include defi...

C 實現任意表達時候求值(棧)

今天花了大概四個小時時間,用棧 stack 實現了 任意表示式的值計算 的問題。c 比 c 好的一點就是,c 的stl定義了大量的資料型別和演算法,相比於 c 更加視覺化。實現這個的基本思路很簡單 分成兩部分完成。兩個主要函式 string shorten string m 把 string m 由...

c 實現任意型別陣列類的封裝

myarray.hpp pragma once include includeusing namespace std templateclass myarray myarray const myarray array myarray 賦值操作符過載 防止淺拷貝 myarray operator my...