广播是一台主机向局域网内的所有主机发送数据。这时,同一网段的所有主机都能接收到数据。发送广播包的步骤大致如下:

(1)确定一个发送广播的接口,如eth0

(2)确定广播的地址,通过ioctl函数,请求码设置为SIOCGIFBRDADDR得到广播的地址

(3)使用这个广播地址进行广播

在局域网内,广播通常用来探测服务器。

广播发送端:

 主机:

 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<netdb.h>
#include <sys/ioctl.h>
#include <net/if.h>
/**
客户端实现广播 **/
#define IP_FOUND "IP_FOUND"
#define IP_FOUND_ACK "IP_FOUND_ACK"
#define IFNAME "eth0"
#define MCAST_PORT 9999
int main(int argc,char*argv[]){
int ret=-; struct sockaddr_in from_addr;//服务端地址
int from_len=sizeof(from_addr);
int count=-;
fd_set readfd;//读文件描述符集合
char buffer[];
struct timeval timeout;
timeout.tv_sec=;//超时时间为2秒
timeout.tv_usec=; int sock=-;
sock=socket(AF_INET,SOCK_DGRAM,);//建立数据报套接字
if(sock<){
printf("HandleIPFound:sock init error\n");
return;
} //将使用的网络接口名字复制到ifr.ifr_name中,由于不同的网卡接口的广播地址是不一样的,因此指定网卡接口 struct ifreq ifr;
strncpy(ifr.ifr_name,IFNAME,strlen(IFNAME));
//发送命令,获得网络接口的广播地址
if(ioctl(sock,SIOCGIFBRDADDR,&ifr)==-){
perror("ioctl error");
return;
} //将获得的广播地址复制到broadcast_addr
int so_broadcast=;
struct sockaddr_in broadcast_addr;//广播地址
memcpy(&broadcast_addr,&ifr.ifr_broadaddr,sizeof(struct sockaddr_in)); //设置广播端口号
printf("broadcast IP is:%s\n",inet_ntoa(broadcast_addr.sin_addr));
broadcast_addr.sin_family=AF_INET;
broadcast_addr.sin_port=htons(MCAST_PORT);
//默认的套接字描述符sock是不支持广播,必须设置套接字描述符以支持广播
ret=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast)); //发送多次广播,看网络上是否有服务器存在
int times=;
int i=;
for(i=;i<times;i++){//一共发送10次广播,每次等待2秒是否有回应
//广播发送服务器地址请求
timeout.tv_sec=;//超时时间为2秒
timeout.tv_usec=;
ret=sendto(sock,IP_FOUND,strlen(IP_FOUND),,(struct sockaddr*)&broadcast_addr,sizeof(broadcast_addr));
if(ret==-){
continue;
} //文件描述符清0
FD_ZERO(&readfd);
//将套接字文件描述符加入到文件描述符集合中
FD_SET(sock,&readfd);
//select侦听是否有数据到来
ret=select(sock+,&readfd,NULL,NULL,&timeout);
switch(ret){
case -:
break;
case :
printf("timeout\n");
break;
default:
//接收到数据
if(FD_ISSET(sock,&readfd)){
count=recvfrom(sock,buffer,,,(struct sockaddr*)&from_addr,&from_len);//from_addr为服务器端地址
printf("recvmsg is %s\n",buffer);
if(strstr(buffer,IP_FOUND_ACK)){
printf("found server IP is:%s\n",inet_ntoa(from_addr.sin_addr));
//服务器端的发送端口号
printf("Server Port:%d\n",htons(from_addr.sin_port));
}
return; }
break; }
}
return;
}

广播接收端:

 #include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <linux/in.h>
#include <stdlib.h>
/**
广播接收端代码
**/
#define IP_FOUND "IP_FOUND"
#define IP_FOUND_ACK "IP_FOUND_ACK"
#define PORT 9999
int main(int argc,char*argv[]){
int ret=-;
int sock;
struct sockaddr_in server_addr;//服务器端地址
struct sockaddr_in from_addr;//客户端地址
int from_len=sizeof(struct sockaddr_in);
int count=-;
fd_set readfd;//读文件描述符集合
char buffer[];
struct timeval timeout;
timeout.tv_sec=;
timeout.tv_usec=;
sock=socket(AF_INET,SOCK_DGRAM,);//建立数据报套接字
if(sock<){
perror("sock error");
return;
} memset((void*)&server_addr,,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htons(INADDR_ANY);
server_addr.sin_port=htons(PORT);
//将地址结构绑定到套接字上./
ret=bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(ret<){
perror("bind error");
return;
} while(){
timeout.tv_sec=;
timeout.tv_usec=;
//文件描述符集合清0
FD_ZERO(&readfd);
//将套接字描述符加入到文件描述符集合
FD_SET(sock,&readfd);
//select侦听是否有数据到来
ret=select(sock+,&readfd,NULL,NULL,&timeout);//侦听是否可读
printf("ret=%d\n",ret);
switch(ret){
case -://发生错误
break;
case ://超时
printf("timeout\n");
break;
default:
if(FD_ISSET(sock,&readfd)){
count=recvfrom(sock,buffer,,,(struct sockaddr*)&from_addr,&from_len);//接收客户端发送的数据
//from_addr保存客户端的地址结构
if(strstr(buffer,IP_FOUND)){
//响应客户端请求
//打印客户端的IP地址
printf("Client IP is%s\n",inet_ntoa(from_addr.sin_addr));
//打印客户端的端口号
printf("Client Send Port:%d\n",ntohs(from_addr.sin_port));
memcpy(buffer,IP_FOUND_ACK,strlen(IP_FOUND_ACK)+);
count=sendto(sock,buffer,strlen(buffer),,(struct sockaddr*)&from_addr,from_len);//将数据发送给客户端
}
return;
}
break;
}
}
return;
}

转自:

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

linux 广播的更多相关文章

  1. linux广播

    linux广播 // 发送端 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #incl ...

  2. 【Socket】linux广播技术

    1.mystery引入        1)本学期学的ARP协议和NTP协议都属于广播技术的实现,所以借此机会了解下广播技术的底层原理    2)在IP地址中,如果最后一个数字为255,则一定是一个广播 ...

  3. linux 广播和组播

    广播和组播 广播,必须使用UDP协议,是只能在局域网内使用,指定接收端的IP为*.*.*.255后,发送的信息,局域网内的所有接受端就能够接到信息了. 广播的发送端代码 #include <st ...

  4. 【Socket】linux黑客之网络嗅探底层原理

      1.mystery引入 1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的 2)原始套接字是一种套接字底层技术,它工作在网络层 3)谈到网络安全,刚好本学期学过这门课程,这里myst ...

  5. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  6. Linux系统下UDP发送和接收广播消息小例子

    // 发送端 #include <iostream> #include <stdio.h> #include <sys/socket.h> #include < ...

  7. linux中C语言发送广播报文

    2. 指令的解决方法: oute add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1 或者 route add -ho ...

  8. ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播

    ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播 Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式 ...

  9. Linux IPC socket 广播,组播

    getsockopt()/setsockopt() //获得sockfd指向的socket的属性 int getsockopt(int sockfd, int level, int optname, ...

随机推荐

  1. SQLServer 2012 Ent 安装失败,另辟蹊径

    今天配到SqlServer2012 安装不了问题,总是NetFX3,然后一次挂了,然后VS2010 Shell也是个悲剧. 装了VS2010,可以了吧,总不能在不给力吧.但是有提示VS2010是打上s ...

  2. April 27 2017 Week 17 Thursday

    Had I not seen the sun, I could have borne the shade. 我本可以忍受黑暗,如果我不曾见过阳光. A poem by Emily Dickinson, ...

  3. 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解. 什么是闭包? 引用高程里的话 => 闭包就是有权访问另一个作用域中变量的函数,闭包是由函数以及创建该函数 ...

  4. 字符串查找算法的改进-hash查找算法

    字符串查找即为特征查找: 特征即位hash: 1.将待查找的字符串hash: 2.在容器字符串中找头字符匹配的字符串,并进行hash: 3.比较hash的结果:相同即位匹配: hash算法的设计为其中 ...

  5. HDU(1016),打素数环

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 哈哈,状态来了就是不一样,很快就A了. 注意的位置是,最后一个点,要与第一个点比较. #incl ...

  6. php图像处理插件imagick安装(仅适用于86位,php5.4非安全环境-16px)

    phpImageMagick-6.7.7-5-Q16-windows-dll(加测试代码,经测试,仅适用于86位,php5.4安全环境-16px) 下载地址:http://pan.baidu.com/ ...

  7. javascript入门笔记8-window对象

    History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都 ...

  8. JSPatch库, 一个Apple官方支持的实现在线更新iOS应用的库

    简介 项目主页: https://github.com/bang590/JSPatch 示例下载: https://github.com/ios122/ios122 JSPatch 可以让你用 Jav ...

  9. 网络基础-交换机、路由器、OSI7层模型

    第1章 网络基础 1.1 网络的诞生 网络的诞生使命:通过各种互联网服务提升全球人类生活品质. 让人类的生活更便捷和丰富,从而促进全球人类社会的进步.并且丰富人类的精神世界和物质世界,让人类最便捷地获 ...

  10. java的八种基本数据类型

             据说表格的方式一目了然 一. java数据类型的取值范围如下: 注意:long型后如果不加 L 则默认为int型,float型如果不加 F 则默认为double型: 注意!注意!注意 ...