Linux網路編程——廣播,linux網路編程

來源:互聯網
上載者:User

Linux網路編程——廣播,linux網路編程
概述

在生活中廣播無處不在,像平時在大街上賣物品的商人,在進行推廣產品的時候往往都是使用一個喇叭來進行吆喝:“十塊錢買不了吃虧,十塊錢買不了上當,走過路過千萬不要錯過”,這就是廣播



那麼在網路中的廣播又是什麼樣子的呢?

網路上的廣播指:由一台主機向該主機所在子網內(同一個區域網路)的所有主機發送資料的方式。如的 1 號主機廣播給 2、3、4、5 號主機發送資料:


實現廣播,離不開廣播位址,同一個子網(區域網路)的所有主機網卡都會接收所在網段廣播位址的資料包。廣播位址應用於區域網路內的所有主機。


廣播位址(Broadcast Address)是專門用於同時向網路中(通常指同一子網)所有工作站進行發送的一個地址。


廣播位址主要分為兩類1)受限廣播

路由器從來不會轉寄受限廣播的資料包,但同一個子網的所有主機都會接收到受限廣播的資料包。


IP 位址的網路欄位和主機欄位全為 1 就是受限廣播位址255.255.255.255


2)直接廣播(也叫定向廣播)

直接廣播可以被路由轉寄,發送到目標網路的所有主機,如:ip地址為 192.168.2.1的主機也可以發送廣播到 192.168.1.0 這個網路。當然不是所有的路由器,通常路由器是預設阻止直接廣播的(可以設定不阻止)。


IP 位址的網路欄位定義這個網路,主機欄位通常全為 1,如192.168.10.0/24 的直接廣播(定向廣播)地址為:192.168.10.255

廣播位址的更詳細介紹,請看《廣播位址介紹》。


廣播特點

對於一個帶網卡裝置的主機,它能接收到哪些網路資料包呢?

1)網卡會接收目的 ip 和它的 ip 地址相同的資料包(至於能不能到應用程式層我們暫時不管,至於MAC地址如何確定我們暫時也不管),這個就是單播傳輸資料。

2)網卡會接收到目的 ip 為廣播位址資料包,這個廣播位址的 MAC 位址為:ff:ff:ff:ff:ff:ff 。

3)如果這個主機加入了多播組,它也會接收該多播組地址的資料包,詳情請看《多播》。


廣播只能用 UDP 或原始IP實現,不能用 TCP


UDP 廣播特點如下:

  • 處於同一子網的所有主機都必須處理資料。
  • UDP 資料包會沿協議棧向上一直到 UDP 層,因為到 UDP 層,連接埠不匹配的話,資料才會丟棄,如,所以,運行音視頻等較高速率工作的應用,會帶來較大的負擔。


廣播樣本使用

預設的情況下,不允許發送廣播資料包,需要修改套介面選項:

int setsockopt( int sockfd, 

int level,  

int optname,

const void *optval,   

socklen_t optlen);

功能:

設定通訊端選項

參數:

sockfd:通訊端

其它參數說明如下:



注意:optval的值應該這樣填,定義一個賦值為 1 的整型變數,int opt=1, 然後把這個變數的地址放這個位置,如:&opt


返回值:

成功執行返回0,否則返回-1


使用例子如下:

//設定該通訊端為廣播類型int opt=1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

下面我們寫一個 UDP 廣播發送資料包例子,目的連接埠指定為 8000,目的 IP 為受限廣播位址:255.255.255.255,那樣,同一個區域網路的所有主機網卡都會收到這個資料,但是,只有連接埠為 8000 的網路應用程式才會收到這個資料包:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>int main(int argc, char *argv[]){unsigned short port = 8000;// 連接埠char *server_ip = "255.255.255.255";// 受限廣播位址int sockfd;sockfd = socket(AF_INET, SOCK_DGRAM, 0);    //建立UDP通訊端if(sockfd < 0){perror("socket");exit(-1);}struct sockaddr_in dest_addr;bzero(&dest_addr, sizeof(dest_addr));dest_addr.sin_family = AF_INET;dest_addr.sin_port   = htons(port);inet_pton(AF_INET, server_ip, &dest_addr.sin_addr);printf("send data to UDP server %s:%d!\n", server_ip, port);//設定該通訊端為廣播類型,這個很重要int opt=1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));char send_buf[512] = "this is a broadcast data";sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));//發送資料close(sockfd);return 0;}

編譯運行如下:




範例程式碼下載請點擊此處。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.