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.mzph.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 转换进制数…