TCP IP網路程式設計 多播與廣播

2021-09-19 16:08:42 字數 4233 閱讀 6546

前言:想想這麼一種情況,網路電台可能需要同時向成千上萬的使用者傳輸相同的資料,如果用我們以前講過的傳輸形式,每個使用者都傳輸一次,這樣肯定是不合理的。因此,就引入了多播技術來解決這個問題,它可以同時向大量使用者傳送相同資料。其基本原理是這樣的:有個多播組,只要加入這個組裡的所有客服端,服務端傳送的資料它們都能收到,具體傳輸到多播組裡的每個客戶是由路由完成的(如果路由器不支援多播或網路堵塞,實現多播也會使用隧道技術)。

2,加入多播組:也是通過套接字可選項設定,示例**中有使用方法,這裡只介紹多播組的結構體ip_mreq。

struct ip_mreq

2,接受者(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的資訊他都收...