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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程 之 广播(五)

發布時間:2024/2/28 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程 之 广播(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄
1. 廣播的定義
2. 廣播地址的分類
3. 廣播的特點
4. 廣播的使用


1. 廣播的定義

所謂的廣播,其實就是一臺主機向主機所在的所有子網內的所有主機發送數據的方式。

2. 廣播地址的分類

廣播地址是一種特殊的IP地址形式,一種是直接廣播地址,一種是有限廣播地址。

  • 受限廣播就是255.255.255.255

    受限廣播可以用在計算機不知道自己IP地址的時候,比如向DHCP服務器索要地址時、PPPOE撥號時等。

    此地址可以在本網絡內廣播,路由器不允許通過它,所以“受限”。

  • 直接廣播就是類似192.168.1.255/24這樣的地址

    直接廣播可用于本地網絡,也可以跨網段廣播,比如主機192.168.1.1/30可以發送廣播包到192.168.1.7,使主機192.168.1.5/30也可以接收到該數據包,前提是之間的路由器要開啟定向廣播功能.

    直接廣播地址是允許通過路由器的,當然不是所有的路由器,傻瓜式路由器是默認阻止直接廣播的。

3. 廣播的特點

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

而且,處于同一個子網的所有主機都必須處理數據。UDP數據包會沿著協議棧一直到UDP層,到了UDP層之后只有當端口不匹配時,數據才會丟棄。

4. 廣播的使用

默認的情況下,不允許發送廣播數據包,需要修改套接口選項:

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
  • sockfd 套接字描述符
  • level 套接字類型
    • SOL_SOCKET 基本套接口
    • IPPROTO_IP IPv4套接口
    • IPPROTO_IPV6 IPv6套接口
    • IPPROTO_TCP TCP套接口
  • optname 其實就是套接字類型對應的選項

    如SOL_SOCKET有三個選項:

    • SO_BROADCAST 允許發送廣播數據包
    • SO_RCVBUF 接收緩存區大小
    • SO_SNDBUF 發送緩存區大小
  • optval 選項對應的值
  • optlen 選項對應值的長度

如果成功返回0,否則返回-1

下面我們寫一個 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, charchar *argv[]) { unsigned short port = 8000; // 端口 charchar *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; } 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。