linux 廣播

廣播是一臺主機向局域網內的所有主機發送數據。這時,同一網段的所有主機都能接收到數據。發送廣播包的步驟大致如下:

(1)確定一個發送廣播的接口,如eth0

(2)確定廣播的地址,通過ioctl函數,請求碼設置為SIOCGIFBRDADDR得到廣播的地址

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

在局域網內,廣播通常用來探測服務器。

?

廣播發送端:

  1 主機:
  2 
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<unistd.h>
  6 #include<string.h>
  7 #include<sys/socket.h>
  8 #include<arpa/inet.h>
  9 #include<netinet/in.h>
 10 #include<sys/types.h>
 11 #include<netdb.h>
 12 #include <sys/ioctl.h>
 13 #include <net/if.h>
 14 /**
 15 客戶端實現廣播
 16 
 17 
 18 **/
 19 #define IP_FOUND "IP_FOUND"
 20 #define IP_FOUND_ACK "IP_FOUND_ACK"
 21 #define IFNAME "eth0"
 22 #define MCAST_PORT 9999
 23 int main(int argc,char*argv[]){
 24 int ret=-1;
 25 
 26 
 27 struct sockaddr_in from_addr;//服務端地址
 28 int from_len=sizeof(from_addr);
 29 int count=-1;
 30 fd_set readfd;//讀文件描述符集合
 31 char buffer[1024];
 32 struct timeval timeout;
 33 timeout.tv_sec=2;//超時時間為2秒
 34 timeout.tv_usec=0;
 35 
 36 int sock=-1;
 37 sock=socket(AF_INET,SOCK_DGRAM,0);//建立數據報套接字
 38 if(sock<0){
 39   printf("HandleIPFound:sock init error\n");
 40   return;
 41 }
 42 
 43 
 44 //將使用的網絡接口名字復制到ifr.ifr_name中,由于不同的網卡接口的廣播地址是不一樣的,因此指定網卡接口
 45 
 46 struct ifreq ifr;
 47 strncpy(ifr.ifr_name,IFNAME,strlen(IFNAME));
 48 //發送命令,獲得網絡接口的廣播地址
 49 if(ioctl(sock,SIOCGIFBRDADDR,&ifr)==-1){
 50     perror("ioctl error");
 51     return;
 52 }
 53 
 54 //將獲得的廣播地址復制到broadcast_addr
 55 int so_broadcast=1;
 56 struct sockaddr_in broadcast_addr;//廣播地址
 57 memcpy(&broadcast_addr,&ifr.ifr_broadaddr,sizeof(struct sockaddr_in));
 58 
 59 
 60 //設置廣播端口號
 61 printf("broadcast IP is:%s\n",inet_ntoa(broadcast_addr.sin_addr));
 62 broadcast_addr.sin_family=AF_INET;
 63 broadcast_addr.sin_port=htons(MCAST_PORT);
 64 //默認的套接字描述符sock是不支持廣播,必須設置套接字描述符以支持廣播
 65 ret=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));
 66 
 67 
 68 
 69 //發送多次廣播,看網絡上是否有服務器存在
 70 int times=10;
 71 int i=0;
 72 for(i=0;i<times;i++){//一共發送10次廣播,每次等待2秒是否有回應
 73   //廣播發送服務器地址請求
 74     timeout.tv_sec=2;//超時時間為2秒
 75         timeout.tv_usec=0;
 76     ret=sendto(sock,IP_FOUND,strlen(IP_FOUND),0,(struct sockaddr*)&broadcast_addr,sizeof(broadcast_addr));
 77     if(ret==-1){
 78         continue;
 79     }
 80 
 81 //文件描述符清0
 82 FD_ZERO(&readfd);
 83 //將套接字文件描述符加入到文件描述符集合中
 84 FD_SET(sock,&readfd);
 85 //select偵聽是否有數據到來
 86 ret=select(sock+1,&readfd,NULL,NULL,&timeout);
 87 switch(ret){
 88  case -1:
 89     break;
 90  case 0:
 91     printf("timeout\n");
 92     break;
 93  default:
 94 //接收到數據
 95  if(FD_ISSET(sock,&readfd)){
 96     count=recvfrom(sock,buffer,1024,0,(struct sockaddr*)&from_addr,&from_len);//from_addr為服務器端地址
 97     printf("recvmsg is %s\n",buffer);
 98     if(strstr(buffer,IP_FOUND_ACK)){
 99         printf("found server IP is:%s\n",inet_ntoa(from_addr.sin_addr));
100         //服務器端的發送端口號
101         printf("Server Port:%d\n",htons(from_addr.sin_port));
102     }
103   return;
104     
105 }
106  break;
107 
108 }
109 }
110 return;
111 }

廣播接收端:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <sys/types.h>
 4 #include <sys/socket.h>
 5 #include <fcntl.h>
 6 #include <linux/in.h>
 7 #include <stdlib.h>
 8 /**
 9 廣播接收端代碼
10 **/
11 #define IP_FOUND "IP_FOUND"
12 #define IP_FOUND_ACK "IP_FOUND_ACK"
13 #define PORT 9999
14 int main(int argc,char*argv[]){
15  int ret=-1;
16  int sock;
17  struct sockaddr_in server_addr;//服務器端地址
18  struct sockaddr_in from_addr;//客戶端地址
19  int from_len=sizeof(struct sockaddr_in);
20  int count=-1;
21  fd_set readfd;//讀文件描述符集合
22  char buffer[1024];
23  struct timeval timeout;
24  timeout.tv_sec=2;
25  timeout.tv_usec=0;
26  sock=socket(AF_INET,SOCK_DGRAM,0);//建立數據報套接字
27  if(sock<0){
28     perror("sock error");
29     return;
30 }
31 
32 memset((void*)&server_addr,0,sizeof(struct sockaddr_in));
33 server_addr.sin_family=AF_INET;
34 server_addr.sin_addr.s_addr=htons(INADDR_ANY);
35 server_addr.sin_port=htons(PORT);
36 //將地址結構綁定到套接字上./
37 ret=bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
38 if(ret<0){
39     perror("bind error");
40     return;
41 }
42 
43 while(1){
44 timeout.tv_sec=2;
45 timeout.tv_usec=0;
46 //文件描述符集合清0
47 FD_ZERO(&readfd);
48 //將套接字描述符加入到文件描述符集合
49 FD_SET(sock,&readfd);
50 //select偵聽是否有數據到來
51 ret=select(sock+1,&readfd,NULL,NULL,&timeout);//偵聽是否可讀
52 printf("ret=%d\n",ret);
53 switch(ret){
54 case -1://發生錯誤
55 break;
56 case 0://超時
57 printf("timeout\n");
58 break;
59 default:
60 if(FD_ISSET(sock,&readfd)){
61     count=recvfrom(sock,buffer,1024,0,(struct sockaddr*)&from_addr,&from_len);//接收客戶端發送的數據
62     //from_addr保存客戶端的地址結構
63     if(strstr(buffer,IP_FOUND)){
64         //響應客戶端請求
65         //打印客戶端的IP地址
66             printf("Client IP is%s\n",inet_ntoa(from_addr.sin_addr));
67         //打印客戶端的端口號
68         printf("Client Send Port:%d\n",ntohs(from_addr.sin_port));
69         memcpy(buffer,IP_FOUND_ACK,strlen(IP_FOUND_ACK)+1);
70         count=sendto(sock,buffer,strlen(buffer),0,(struct sockaddr*)&from_addr,from_len);//將數據發送給客戶端
71     }
72  return;
73 }
74 break;
75 }
76 }
77 return;
78 }

轉自:

http://blog.csdn.net/chenjin_zhong/article/details/7270213

轉載于:https://www.cnblogs.com/meizixiong/p/3228182.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259547.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

thinkphp5.1 php7,空白目錄 · 細數ThinkPHP5.1.7版本新特性 · 看云

>[danger] 官方已經在前不久發布了ThinkPHP5.1.7版本&#xff0c;5.1版本相較于5.0版本而言&#xff0c;本身更加嚴謹和規范&#xff0c;更接近主流設計思想。近半年來&#xff0c;5.1版本更新頻繁&#xff0c;此次最新版本更是帶來了很多的新特性。正在或者打算使用5.1版本…

JS中popup.js

為什么80%的碼農都做不了架構師&#xff1f;>>> //popup class 顯示彈出窗口&#xff0c;。/*以下為使用popup對象&#xff0c;傳入相應的配置參數&#xff0c;彈出不同類型的窗口 function ShowIframe() //顯示iframe { var popnew P…

圖像連通域標記算法研究

搬以前寫的博客【2014-03-01 08:09】 圖像連通域標記算法研究 ConnectedComponent Labeling 最近在研究一篇復雜下背景文字檢測的論文。 “Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章&#xff0c;它主要探討利用文字內…

lightoj 1214

lightoj 1214 Large Division &#xff08;大數除法&#xff09; 鏈接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1214 題意&#xff1a;給定 a&#xff0c; b 兩個數&#xff0c;判斷 a 是否整除 b 。&#xff08;a 為 大數&#xff09; 思路&#…

二階振蕩衰減 matlab,基于Matlab/Simulink的二階控制系統仿真研究

1 二階控制系統模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能夠用二階微分方程描述的系統稱為二階控制系統。在控制工程實踐中&#xff0c;二階控制系統十分常見&#xff0c;例如&#xff0c;電樞控制的直流電動機&#xff0c;RLC網絡和彈簧…

CCF201409-5 拼圖(30分)

試題編號&#xff1a; 201409-5 試題名稱&#xff1a; 拼圖 時間限制&#xff1a; 3.0s 內存限制&#xff1a; 256.0MB 問題描述&#xff1a; 問題描述給出一個nm的方格圖&#xff0c;現在要用如下L型的積木拼到這個圖中&#xff0c;使得方格圖正好被拼滿&#xff0c;請問總共有…

歐幾里得算法(即輾轉相除法)的時間復雜度

本文是參考新浪博客而寫。 歐幾里得算法, 又稱輾轉相除法, 用于求兩個自然數的最大公約數. 算法的思想很簡單, 基于下面的數論等式 gcd(a, b) gcd(b, a mod b) 其中gcd(a, b)表示a和b的最大公約數, mod是模運算, 即求a除以b的余數. 代碼如下: #include <iostream> #i…

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有兩種讀取圖片數據的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函數需要兩個參數:圖片的引用和壓縮系數.而UIImagePNGRepresentation只需要圖片引用作為參數.通過在實際使用過程中,比較發現: UIImagePNGRepresenta…

C++ 0x

轉載于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序員學用Oracle系列

.Net程序員學用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序員學用Oracle系列(17)&#xff1a;數據庫管理工具(SQL Plus).Net程序員學用Oracle系列(16)&#xff1a;訪問數據庫(ODP.NET).Net程序員學用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序員學用Or…

Github for Windows使用介紹

Git已經變得非常流行&#xff0c;連Codeplex現在也已經主推Git。Github上更是充斥著各種高質量的開源項目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。對于習慣Windows圖形界面的程序員來講&#xff0c;Github的使用是需要點時間和耐心的&#xff0c;然而最近Githu…

matlab中udt函數,《MATLAB信號處理超級學習手冊》——2.5 離散時間信號中的運算...

本節書摘來自異步社區《MATLAB信號處理超級學習手冊》一書中的第2章&#xff0c;第2.5節&#xff0c;作者&#xff1a;MATLAB技術聯盟 , 史潔玉著&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看2.5 離散時間信號中的運算MATLAB信號處理超級學習手冊2.5.1 離散…

iOS 將16進制顏色轉換成UIColor

很多地方我們都使用16進制顏色&#xff0c;但iPhone使用的是UIColor對象&#xff0c;不直接支持16進制顏色&#xff0c;為此&#xff0c;需要我們手動將16進制顏色轉換為UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一種標準的3D模型文件格式&#xff0c;很適合用于3D軟件模型之間的互導。比如在3dsMax或LightWave中建了一個模型&#xff0c;想把它調到Maya里面渲染或動畫&#xff0c;導出OBJ文件就是一種很好的選擇。目前幾乎所有知名的3D軟件都支持OBJ文件的讀寫&#xff0c;不過…

構建Docker鏡像(三)

作者:李曉輝聯系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、準備文件新建一個目錄和一個 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile這個步驟是在設計鏡像&#xff0c;如果你需要在鏡像內包含什么軟件&#xff0c;將來開放哪些端口&…

centos 配置php開發環境變量配置,CentOS中配置PHP和Nginx環境變量

搜索熱詞一、摘要在Linux CentOS系統上 安裝完PHP和Nginx后&#xff0c;一般需要執行查看版本命令’PHP -v’和’Nginx -v’,確認是否安裝成功,如果在沒有添加到環境變量之前&#xff0c;執行“PHP -v”命令查看當前PHP版本信息時&#xff0c;則會提示命令不存在的錯誤&#xf…

你必須很努力,才能看上去毫不費力

世上沒有一件工作不辛苦&#xff0c;沒有一處人事不復雜。 從今天起&#xff0c;每天微笑吧&#xff0c; 世上除了生死&#xff0c;都是小事。 不管遇到了什么煩心事&#xff0c;都不要自己為難自己&#xff1b; 無論今天發生多么糟糕的事&#xff0c;都不應該感到悲傷。 今天是…

HDU 4631 Sad Love Story 平面內最近點對

http://acm.hdu.edu.cn/showproblem.php?pid4631 題意: 在平面內依次加點,求每次加點后最近點對距離平方的和 因為是找平面最近點對...所以加點以后這個最短距離一定是遞減的...所以最后會形成這樣一個函數圖像 所以我們只要從后往前依次刪點即可... 15秒驚險水過...不過我最小…

c++三/五法則

如果這個類需要一個析構函數&#xff0c;我們幾乎可以肯定它也需要一個拷貝構造函數和一個拷貝賦值運算符。 如果一個類需要拷貝構造函數&#xff0c;幾乎可以肯定它也需要一個拷貝賦值運算符&#xff0c;反之亦然。 然而&#xff0c;無論是需要拷貝構造函數還是需要拷貝賦值運…

itoa的用法

功能&#xff1a;將任意類型的整數轉換為字符串。在<stdlib.h>中與之有相反功能的函數是atoi。 用法&#xff1a;char*itoa(int value,char*string,int radix); int value 被轉換的整數&#xff0c;char *string 轉換后儲存的字符數組&#xff0c;int radix 轉換進制數…