前言:想想這麼一種情況,網路電台可能需要同時向成千上萬的使用者傳輸相同的資料,如果用我們以前講過的傳輸形式,每個使用者都傳輸一次,這樣肯定是不合理的。因此,就引入了多播技術來解決這個問題,它可以同時向大量使用者傳送相同資料。其基本原理是這樣的:有個多播組,只要加入這個組裡的所有客服端,服務端傳送的資料它們都能收到,具體傳輸到多播組裡的每個客戶是由路由完成的(如果路由器不支援多播或網路堵塞,實現多播也會使用隧道技術)。
2,加入多播組:也是通過套接字可選項設定,示例**中有使用方法,這裡只介紹多播組的結構體ip_mreq。
struct ip_mreq2,接受者(receiver)
//
// main.cpp
// hello_client
////
#include
#include
#include
#include
#include
#include
#define buf_size 30
void error_handling(char *message);
int main(int argc, const
char * ar**)
recv_sock = socket(pf_inet, sock_dgram, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family = af_inet;
adr.sin_addr.s_addr = htonl(inaddr_any);
adr.sin_port = htons(atoi(ar**[2]));
if(bind(recv_sock, (struct sockaddr *)&adr, sizeof(adr)) == -1)
error_handling("bind() error");
//加入多播組
廣播在功能上和多播是一樣的,都是同時可以向大量客戶傳遞資料。但他們在網路範圍上有區別,多播可以跨越不同的網路,只要加入了多播組就能接收資料。但廣播只能向同一網路中的主機傳輸資料。
廣播分為:直接廣播與本地廣播,直接廣播sender的ip位址只需指定網路位址,主機位址全部填255。這樣處在這個網路位址裡的所有主機就可以接收資料了。而本地廣播sender的ip位址寫255.255.255.255,這樣本地網路所有主機就可以接收資料了。
//將so_broadcast可選項設定為1就表示開啟了套接字廣播功能,預設是關閉的。
int bcast = 1;
setsockopt(send_sock, sol_socket, so_broadcast, (void *) &bcast, sizeof(bcast));
下面就多播的**示例稍作修改,本地廣播的示例如下:
//
// main.cpp
// hello_server
////
#include
#include
#include
#include
#include
#include
#define ttl 64 //資料報生存時間,即最多可以傳遞經過第64個路由時銷毀
#define buf_size 30
void error_handling(char *message);
int main(int argc, const
char * ar**)
//基於udp的多播
send_sock = socket(pf_inet, sock_dgram, 0);
memset(&mul_adr, 0, sizeof(mul_adr));
mul_adr.sin_family = af_inet;
mul_adr.sin_addr.s_addr = inet_addr(ar**[1]);
mul_adr.sin_port = htons(atoi(ar**[2]));
//設定生存時間(除了這裡其它基本和udp編寫一樣)
//setsockopt(send_sock, ipproto_ip, ip_multicast_ttl, (void *)&time_live, sizeof(time_live));
/*add:廣播修改處*/
//預設套接字是關閉廣播的,開啟如下:
int so_brd = 1; //設定為1就可以開啟廣播
setsockopt(send_sock, sol_socket, so_broadcast, (void *)&so_brd, sizeof(so_brd));
error_handling("fopen() error");
while (!feof(fp)) //如果檔案結束,則返回非0值,否則返回0
fclose(fp);
close(send_sock);
return0;}
void error_handling(char *message)
//
// main.cpp
// hello_client
////
#include
#include
#include
#include
#include
#include
#define buf_size 30
void error_handling(char *message);
int main(int argc, const
char * ar**)
recv_sock = socket(pf_inet, sock_dgram, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family = af_inet;
adr.sin_addr.s_addr = htonl(inaddr_any);
adr.sin_port = htons(atoi(ar**[1]));
if(bind(recv_sock, (struct sockaddr *)&adr, sizeof(adr)) == -1)
error_handling("bind() error");
//加入多播組
前言:想想這麼一種情況,網路電台可能需要同時向成千上萬的使用者傳輸相同的資料,如果用我們以前講過的傳輸形式,每個使用者都傳輸一次,這樣肯定是不合理的。因此,就引入了多播技術來解決這個問題,它可以同時向大量使用者傳送相同資料。其基本原理是這樣的:有個多播組,只要加入這個組裡的所有客服端,服務端傳送的資料它們都能收到,具體傳輸到多播組裡的每個客戶是由路由完成的(如果路由器不支援多播或網路堵塞,實現多播也會使用隧道技術)。
UNIX網路程式設計 廣播與多播
前言 繼續補上我的部落格,這幾天專注把 unix網路程式設計 的內容總結。1.單播與廣播的比較 單播 過程 中間主機的乙太網介面看到該幀,並將它的目的乙太網與自己的乙太網位址進行比較。由於二者不相等,介面便忽略該幀。因此,單播幀不會對這台主機造成任何額外開銷,因為忽略它們的是介面而不是主機。右邊主機...
廣播與多播
廣播和多播僅用於udp。乙個主機要向網上的所有主機傳送幀,這就是廣播 每個乙太網幀僅發住單個目的主機,目的位址指明單個接收介面,因而稱為單播。多播介於單播與廣播之間 幀僅傳送給屬於多播組的多個主機 ip多播提供兩類服務 1 向多個目的位址傳送資料。有許多向多個接收者傳送資訊的應用 例如互動式會議系統...
socket程式設計(3)廣播 多播
廣播 廣播是指在乙個區域網中向所有的網上節點傳送資訊。這是udp連線的一種 廣播有乙個廣播組,即只有乙個廣播組內的節點才能收到發往這個廣播組的資訊。什麼決定了乙個廣播組呢,就是埠號,區域網內乙個節點,如果設定了廣播屬性並監聽了埠號a後,那麼他就加入了a組廣播,這個區域網內所有發往廣播埠a的資訊他都收...