socket程式設計(3)廣播 多播

2021-05-24 08:47:32 字數 3008 閱讀 2984

廣播

廣播是指在乙個區域網中向所有的網上節點傳送資訊。這是udp連線的一種

廣播有乙個廣播組,即只有乙個廣播組內的節點才能收到發往這個廣播組的資訊。什麼決定了乙個廣播組呢,就是埠號,區域網內乙個節點,如果設定了廣播屬性並監聽了埠號a後,那麼他就加入了a組廣播,這個區域網內所有發往廣播埠a的資訊他都收的到。在廣播的實現中,如果乙個節點想接受a組廣播資訊,那麼就要先將他繫結給位址和埠a,然後設定這個socket的屬性為廣播屬性。如果乙個節點不想接受廣播資訊,而只想傳送廣播資訊,那麼不用繫結埠,只需要先為socket設定廣播屬性後,向廣播位址inaddr_broadcast的a埠傳送udp資訊即可。詳細的程式實現如下:

1.初始化

wsastartup(makeword(2,2),&wsad);

2.建立乙個udp的socket

s=socket(af_inet,sock_dgram,0);

3.如果這個socket希望收到資訊,則需要繫結位址和這組廣播的埠號,如果只是希望傳送廣播資訊,則不需要這步

sockaddr_in udpadress,sender;

int senferaddsize=sizeof(sender);

udpadress.sin_family=af_inet;

udpadress.sin_port=htons(11114);

udpadress.sin_addr.s_addr=inet_addr("10.11.131.32");

bind(s,(sockaddr*)&udpadress,sizeof(udpadress));

//這樣這個節點即可收到區域網內所有發往埠11114的廣播資訊

4.設定socket的屬性為廣播

bool optval=true;

setsockopt(s,sol_socket,so_broadcast,(char*)&optval,sizeof(bool));

5.下面就可以使用recvfrom或sendto來收發廣播資訊了

這裡是接受,這是乙個阻塞操作

ret=recvfrom(s,data,1000,0,(sockaddr*)&sender,&senferaddsize);

這裡是像該廣播組傳送資訊,注意傳送的位址為廣播位址inaddr_broadcast,埠號為改組廣播的埠號11114

sockaddr_in dstadd;

dstadd.sin_family=af_inet;

dstadd.sin_port=htons(11114);

dstadd.sin_addr.s_addr=inaddr_broadcast;

sendto(s,data(),totalbyte,0,(sockaddr*)&dstadd,sizeof(sockaddr));

多播

多播與廣播不同,多播是指一條資訊向區域網內有限幾個節點傳遞,而廣播是不管某個節點是否在制定組內,都會向這個節點傳送廣播資訊,容易造成網路負擔嚴重。

多播的實現是靠多播組,在區域網內,乙個多播位址唯一的定義了乙個多播組(埠號任意),可以使用的多播位址是有規定的,從224.0.0.0—239.255.255.255之間,但是其中的一些位址不能用,是用作特殊用途的:224.0.0.0 –224.0.0.2  224.0.1.1  224.0.0.9 224.0.1.24。乙個節點如果想接受自某個多播組或向某個多播組傳送資訊,必須首先加入多播組,然後給予udp傳送。下面是詳細的**實現。

1.初始化

wsastartup(makeword(2,2),&wsad);

3.將socket繫結到乙個本地位址、埠,和廣播不同,在多播中,無論是傳送還是接收端都必須繫結乙個本地位址,這個位址就是多播通訊時處理資訊的埠

udpadress.sin_family=af_inet;

udpadress.sin_port=htons(22222);

udpadress.sin_addr.s_addr=inet_addr("10.11.131.32");

bind(s,(sockaddr*)&udpadress,sizeof(udpadress));

4.定義多播組的位址

multicastgroup.sin_family=af_inet;

multicastgroup.sin_port=htons(1111);此處埠任意,每個節點的可以設定成不同的

multicastgroup.sin_addr.s_addr=inet_addr("224.0.0.3"); 此處需使用上面規定位址段內的多播位址

5.加入這個多播組。注意這裡的函式返回了乙個socket,這個socket不負責通訊,只是在脫離多播組時使用

socket sockm=wsajoinleaf(s,(sockaddr*)&multicastgroup,sizeof(multicastgroup),null,null,null,null,jl_both);

6.下面使用recvfrom接受多播資訊,或者使用sendto傳送多播資訊   

ret=recvfrom(s,data,1000,0,(sockaddr*)&sender,&senferaddsize);

sendto(s,data(),totalbyte,0,(sockaddr*)&multicastgroup,sizeof(multicastgroup));

7.最後關閉清理

closesocket(sockm);

closesocket(s);

wsacleanup();

其他:bool val=false;

setsocket(s,ipproto_ip,ip_multicast_loop,(char*)val,sizeof(val));

2)在多播時,通常要設定適當的ttl(ttl的值是多少,那麼多播資訊就可以經過多少路由器,每經過乙個路由器,ttl的值自動減1):

int val=3;

setsocket(s,ipproto_ip,ip_multicast_ttl,(char*)val,sizeof(int));

廣播和多播

1.1.單播 unicast 單播是說,對特定的主機進行資料傳送。例如給某乙個主機傳送ip資料報。這時候,資料鏈路層給出的資料頭裡面是非常具體的目的位址,對於乙太網來說,就是網絡卡的mac位址 不是ff ff ff ff ff ff這樣的位址 現在的具有路由功能的主機應該可以將單播資料定向 而目的主...

廣播和多播

廣播和多播僅應用於udp資料報,而tcp是面向連線的協議,它分別執行於兩主機 由ip位址確定 的兩程序 由埠號確定 間的一條連線,因而不可能使用廣播或者多播 主機對通道傳送過來的幀地過濾過程 1.網絡卡檢視由通道傳送過來的幀,確定是否接收該幀,如果接收就傳遞給裝置驅動程式 如果幀檢驗和出錯,網絡卡就...

廣播與多播

廣播和多播僅用於udp。乙個主機要向網上的所有主機傳送幀,這就是廣播 每個乙太網幀僅發住單個目的主機,目的位址指明單個接收介面,因而稱為單播。多播介於單播與廣播之間 幀僅傳送給屬於多播組的多個主機 ip多播提供兩類服務 1 向多個目的位址傳送資料。有許多向多個接收者傳送資訊的應用 例如互動式會議系統...