日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux网络编程】广播

發(fā)布時(shí)間:2024/4/24 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux网络编程】广播 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 廣播概述
    • 02. 廣播地址分類
    • 03. 廣播的特點(diǎn)
    • 04. setsockopt函數(shù)
    • 05. 程序示例
    • 06. 附錄

01. 廣播概述

在生活中廣播無處不在,像平時(shí)在大街上賣物品的商人,在進(jìn)行推廣產(chǎn)品的時(shí)候往往都是使用一個(gè)喇叭來進(jìn)行吆喝:“十塊錢買不了吃虧,十塊錢買不了上當(dāng),走過路過千萬不要錯(cuò)過”,這就是廣播

那么在網(wǎng)絡(luò)中的廣播又是什么樣子的呢?

網(wǎng)絡(luò)上的廣播指:由一臺主機(jī)向該主機(jī)所在子網(wǎng)內(nèi)(同一個(gè)局域網(wǎng))的所有主機(jī)發(fā)送數(shù)據(jù)的方式。如下圖的 1 號主機(jī)廣播給 2、3、4、5 號主機(jī)發(fā)送數(shù)據(jù):

實(shí)現(xiàn)廣播,離不開廣播地址,同一個(gè)子網(wǎng)(局域網(wǎng))的所有主機(jī)網(wǎng)卡都會接收所在網(wǎng)段廣播地址的數(shù)據(jù)包。廣播地址應(yīng)用于局域網(wǎng)內(nèi)的所有主機(jī)

廣播地址(Broadcast Address)是專門用于同時(shí)向網(wǎng)絡(luò)中(通常指同一子網(wǎng))所有工作站進(jìn)行發(fā)送的一個(gè)地址。

02. 廣播地址分類

1) 受限廣播

路由器從來不會轉(zhuǎn)發(fā)受限廣播的數(shù)據(jù)包,但同一個(gè)子網(wǎng)的所有主機(jī)都會接收到受限廣播的數(shù)據(jù)包。

IP 地址的網(wǎng)絡(luò)字段和主機(jī)字段全為 1 就是受限廣播地址255.255.255.255

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

直接廣播可以被路由轉(zhuǎn)發(fā),發(fā)送到目標(biāo)網(wǎng)絡(luò)的所有主機(jī),如:ip地址為 192.168.2.1的主機(jī)也可以發(fā)送廣播到 192.168.1.0 這個(gè)網(wǎng)絡(luò)。當(dāng)然不是所有的路由器,通常路由器是默認(rèn)阻止直接廣播的(可以設(shè)置不阻止)。

IP 地址的網(wǎng)絡(luò)字段定義這個(gè)網(wǎng)絡(luò),主機(jī)字段通常全為 1,如192.168.10.0/24 的直接廣播(定向廣播)地址為:192.168.10.255

03. 廣播的特點(diǎn)

對于一個(gè)帶網(wǎng)卡設(shè)備的主機(jī),它能接收到哪些網(wǎng)絡(luò)數(shù)據(jù)包呢?

1)網(wǎng)卡會接收目的 ip 和它的 ip 地址相同的數(shù)據(jù)包(至于能不能到應(yīng)用層我們暫時(shí)不管,至于MAC地址如何確定我們暫時(shí)也不管),這個(gè)就是單播傳輸數(shù)據(jù)。

2)網(wǎng)卡會接收到目的 ip 為廣播地址數(shù)據(jù)包,這個(gè)廣播地址的 MAC 地址為:ff:ff:ff:ff:ff:ff 。

3)如果這個(gè)主機(jī)加入了多播組,它也會接收該多播組地址的數(shù)據(jù)包。

UDP 廣播特點(diǎn)如下:

  • 處于同一子網(wǎng)的所有主機(jī)都必須處理數(shù)據(jù)。
  • UDP 數(shù)據(jù)包會沿協(xié)議棧向上一直到 UDP 層,因?yàn)榈?UDP 層,端口不匹配的話,數(shù)據(jù)才會丟棄,如下圖,所以,運(yùn)行音視頻等較高速率工作的應(yīng)用,會帶來較大的負(fù)擔(dān)。

04. setsockopt函數(shù)

默認(rèn)的情況下,不允許發(fā)送廣播數(shù)據(jù)包,需要修改套接口選項(xiàng):

int setsockopt( int sockfd, int level, int optname,const void *optval, socklen_t optlen); 功能:設(shè)置套接字選項(xiàng)參數(shù):sockfd 套接字level SOL_SOCKEToptname SO_BROADCAST 允許發(fā)送廣播數(shù)據(jù)包SO_RCVBUF 接收緩沖區(qū)大小SO_SNDBUF 發(fā)送緩沖區(qū)大小optval 一般是int類型optlen optval所指向類型的字節(jié)大小返回值:成功執(zhí)行返回0,否則返回-1

注意:optval的值應(yīng)該這樣填,定義一個(gè)賦值為 1 的整型變量,int opt=1, 然后把這個(gè)變量的地址放這個(gè)位置,如:&opt

應(yīng)用示例

//設(shè)置該套接字為廣播類型 int opt=1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

05. 程序示例

源代碼

#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); //創(chuàng)建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);//設(shè)置該套接字為廣播類型,這個(gè)很重要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));//發(fā)送數(shù)據(jù)close(sockfd);return 0; }

執(zhí)行結(jié)果

溫馨提示

如果客戶端收不到數(shù)據(jù) 可能是Linux的防火墻沒有關(guān)閉導(dǎo)致,這時(shí)關(guān)閉防火墻即可。

06. 附錄

【Linux】一步一步學(xué)Linux網(wǎng)絡(luò)編程教程匯總: https://dengjin.blog.csdn.net/article/details/103026352

總結(jié)

以上是生活随笔為你收集整理的【Linux网络编程】广播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。