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 //廣播傳送伺服器位址請求
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;
}伺服器:
#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得到廣播的...