【Socket】linux广播技术
1.mystery引入
2)在IP地址中,如果最后一个数字为255,则一定是一个广播地址
3)广播地址分为网络广播地址/受限广播地址/子网广播地址和全部子网广播地址
4)在设计广播程序时,要进行套接字的属性设置
5)广播通信要采用UDP的方式
6)广播套接字的属性为SO_BROADCAST
7)广播地址为INADDR_BROADCAST,同时也要指定发送的端口
2.实例操作
1)实现一个基于C/S模式的广播通信,服务器端程序负责创建广播组,并提供一个键盘输入接口,输入的信息向组内成员广播发送
2)客户端加入广播组,接收服务端的信息并显示,若发现信息中包含quit,则退出程序
3)源代码
服务器端:
//serverbroad.c
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#define BUFFSIZE
#define PORT 5050
int main()
{
int serversocket;
struct sockaddr_in serveraddress,clientaddress;
int so_broadcast = 1;
socklen_t size;
if((serversocket=(socket(AF_INET,SOCK_DGRAM,0))) < 0)
{
perror("socket");
return 0;
}
if(setsockopt(serversocket,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast)) < 0)
{
perror("setsockopt");
return 0;
}
serveraddress.sin_family=AF_INET;
serveraddress.sin_port=htons(INADDR_ANY);
serveraddress.sin_addr.s_addr= htonl(INADDR_BROADCAST);
if((bind(serversocket,(struct sockaddr *)&serveraddress, sizeof(struct sockaddr))) < 0)
{
perror("bind");
return 0;
}
clientaddress.sin_family=AF_INET;
clientaddress.sin_port=htons(PORT);
clientaddress.sin_addr.s_addr= htonl(INADDR_BROADCAST);
while (1)
{
char buf[200];
printf("please input your word:>");
scanf("%s",buf);
if((sendto(serversocket,buf,strlen(buf),0,(struct sockaddr *)&clientaddress,sizeof(clientaddress))) < 0)
{
perror("sendto error");
return 0;
}
else
printf("send msg %s\n",buf);
}
return 0;
}
客户端:
//clientbroad.c
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
int main()
{
int clientsocket;
struct sockaddr_in serveraddress,clientaddress;
clientsocket = socket(AF_INET, SOCK_DGRAM, 0);
serveraddress.sin_family = AF_INET;
serveraddress.sin_port = htons(5050);
serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);
int opt = 1;
if(setsockopt(clientsocket, SOL_SOCKET, SO_REUSEADDR,&opt, sizeof(opt)) < 0)
{
perror("setsockopt:SO_REUSEADDR");
return 0;
}
if(bind(clientsocket,(struct sockaddr*)&serveraddress,sizeof(struct sockaddr)) != 0)
{
perror("bind");
return 0;
}
char buf[200];
while (1)
{
memset(buf,0,200);
int size = 0;
size = recvfrom(clientsocket,buf,200,0, (struct sockaddr *)&serveraddress,sizeof(serveraddress));
buf[size] = '\0';
printf("IP:%s msg:%s\n",inet_ntoa(serveraddress.sin_addr),buf);
if(strcmp(buf,"quit") == 0)
{
printf("system quit!!!!\n");
close(clientsocket);
return 0;
}
}
return 0;
}
3.mystery注解
1)效果如图

2)由图可以看出,这个程序并没有成功,因为广播组内的成员并没有收到广播消息
3)mystery尝试查找问题所在原因,但是在源代码中没有找出错误,纠结
4.mystery调试
1)上网查证了下,对源代码进行了部分改动
2)广播要点:广播目的端口一定要和接收者监听的端口一致
3)在防火墙中允许广播
4)经过调试,还是未成功,不过广播和组播的原理就是这样,估计是系统的原因。纠结……
本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1155115
【Socket】linux广播技术的更多相关文章
- 掌握 Linux 调试技术
掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- Windows完成端口与Linux epoll技术简介
收藏自:http://www.cnblogs.com/cr0-3/archive/2011/09/09/2172280.html WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点 ...
- Windows完成端口与Linux epoll技术简介(能看懂)
WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点3.完成端口(Completion Ports )相关数据结构和创建4.完成端口线程的工作原理5.Windows完成端口的实例代码 ...
- linux广播
linux广播 // 发送端 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #incl ...
- 学习笔记:CentOS7学习之十九:Linux网络管理技术
目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...
- 红帽Linux故障定位技术详解与实例(1)
红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- linux 编程技术
linux 编程技术No.1前期准备工作 GCC的编译过程分为预处理.生成汇编代码.生成目标代码和链接成可执行文件等4个步骤. 使用vim编写C 文件 : [lining@localhost prog ...
- 关于Linux虚拟化技术KVM的科普
虚拟化技术应用越来越广泛,虚拟化技术需求越来越强劲.KVM.XEN.Docker等比较热门,尤其是KVM技术越来越受欢迎. 基于此背景,了解一下KVM+QEMU就有点必要了. 从网上收集了一些资料进行 ...
随机推荐
- 总结一下关于mysql 5.6 新特性
一直断断续续的看一些mysql特性,今天总结一下,以下是列表,网址 http://mariadb.org/ (也是类似的特性), http://mysql.com/ 最近在看关于mysql新特性的一些 ...
- java struts2入门学习--防止表单重复提交.OGNL语言学习
一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...
- 详解PV、UV、VV、IP及其关系与计算
一.什么是PV? PV即Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量.用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计.一般来说,PV与来访者的数量 ...
- 【IL】IL指令详解
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- maven最全教程
Maven 教程 1.Maven概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基 ...
- 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token
为什么你学不会递归?告别递归,谈谈我的一些经验 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...
- golang 学习 ---- channel
把一个loop放在一个goroutine里跑,我们可以使用关键字go来定义并启动一个goroutine: package main import "fmt" func loop() ...
- MongodDB---初识
NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...
- [javase学习笔记]-7.2 构造函数与一般函数的差别
这一节我们简单学习一下构造函数与一般函数之间的差别所在. 那么它们有什么差别呢,结合上一节,我们能够总结出下面两点差别: 第一个差别: 构造函数:对象创建时,就会调用与之相应的构造函数,对对象进行初始 ...
- nginx last 和break redirect 和 permanent
一.last & break (1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异. 注意一点就是,他们会跳过所有的在他们之后的rewrite 模块 ...