Linux網路程式設計之廣播

2021-07-25 13:39:43 字數 2430 閱讀 9524

1.概念

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

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

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

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

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

2. 探測伺服器例項

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

主機:

/**客戶端實現廣播

**/ #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 //廣播傳送伺服器位址請求

timeout.tv_sec=2;//超時時間為2秒

timeout.tv_usec=0;

ret=sendto(sock,ip_found,strlen(ip_found),0,(struct sockaddr*)&broadcast_addr,sizeof(broadcast_addr));

if(ret==-1)

//檔案描述符清0

fd_zero(&readfd);

//將套接字檔案描述符加入到檔案描述符集合中

fd_set(sock,&readfd);

//select偵聽是否有資料到來

ret=select(sock+1,&readfd,null,null,&timeout);

switch(ret)

return;

} break;

} }return;

}伺服器:

/**廣播伺服器端**

**/ #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得到廣播的...