Linux網路程式設計之廣播

2021-06-16 08:28:26 字數 2279 閱讀 8243

1.概念

前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下:

(1)確定乙個傳送廣播的介面,如eth0

(2)確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的位址

(3)使用這個廣播位址進行廣播

由於tcp協議是端到端的協議,在通訊之前,必須建立連線,三次握手之後才能傳送資料。而廣播是一對多的通訊,所以tcp不支援廣播。在區域網內,廣播通常用來探測伺服器。

2. 探測伺服器例項

這個例子通過在區域網內傳送廣播包,收到廣播包的伺服器,應答主機。這樣,就能夠探測到區域網內的伺服器。

主機:#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/**客戶端實現廣播

**/#define ip_found "ip_found"

#define ip_found_ack "ip_found_ack"

#define ifname "eth0"

#define mcast_port 9999

int main(int argc,char*argv)

//將使用的網路介面名字複製到ifr.ifr_name中,由於不同的網絡卡介面的廣播位址是不一樣的,因此指定網絡卡介面

strncpy(ifr.ifr_name,ifname,strlen(ifname));

//傳送命令,獲得網路介面的廣播位址

if(ioctl(sock,siocgifbrdaddr,&ifr)==-1)

//將獲得的廣播位址複製到broadcast_addr

memcpy(&broadcast_addr,&ifr.ifr_broadaddr,sizeof(struct sockaddr_in));

//設定廣播埠號

printf("broadcast ip is:%s\n",inet_ntoa(broadcast_addr.sin_addr));

broadcast_addr.sin_family=af_inet;

broadcast_addr.sin_port=htons(mcast_port);

//預設的套接字描述符sock是不支援廣播,必須設定套接字描述符以支援廣播

ret=setsockopt(sock,sol_socket,so_broadcast,&so_broadcast,sizeof(so_broadcast));

//傳送多次廣播,看網路上是否有伺服器存在

int times=10;

int i=0;

for(i=0;i

伺服器:

#include

#include

#include

#include

#include

#include

#include

/**廣播伺服器端**

**/#define ip_found "ip_found"

#define ip_found_ack "ip_found_ack"

#define port 9999

int main(int argc,char*argv)

memset((void*)&server_addr,0,sizeof(struct sockaddr_in));

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=htons(inaddr_any);

server_addr.sin_port=htons(port);

//將位址結構繫結到套接字上./

ret=bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret<0)

while(1)

return;

}break;}}

return;

}說明: 由於預設的套接字是不支援廣播的,所以必須設定套接字選項(setsockopt)來支援廣播。介面的廣播位址通過ioctl函式得到。廣播是基於udp協議的。mac位址是ff:ff:ff:ff:ff:ff.

總結:本文主要介紹了區域網內廣播包的傳送,最後給出了乙個探測伺服器的廣播例項。

Linux網路程式設計之廣播

1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...

Linux網路程式設計之廣播

1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...

Linux網路程式設計之廣播

1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...