58.1 广播介绍

58.1.1 介绍

  • 广播实现一对多的通讯
  • 它通过向广播地址发送数据报文实现的

  

58.1.2 套接字选项

  • 套接字选项用于修饰套接字以及其底层通讯协议的各种行为。函数 setsockopt 和 getsockopt 可以查看和设置套接字的各种选项。

  

  • optname 选项

    • SO_BROADCAST 选项控制着 UDP 套接字是否能够发送广播数据报,选项的类型为 int, 非0 意味着 ”是“,注意,只有 UDP 套接字可以使用这个选项, TCP 是不能使用广播的

  

  • optname 选项

    • SO_SNDBUF 和 SO_RCVBUF:每一个套接字有一个发送缓冲区和接收缓冲区,这两个缓冲区由底层协议使用,接收缓冲区存放由协议接收的数据直到被应用程序读走,发送缓冲区存放应用写出的数据直到被协议发送出去。SO_SNDBUF 和 SO_RCVBUF 选项分别控制发送和接收缓冲区的大小,他们的类型均为 int,以字节为单位。

  

  • getsockopt 去获取发送缓冲区的大小,缓冲区的大小存放在 opt 中
  • setsockopt 去扩大发送缓冲区的大小,缓冲区的大小由 opt 扩大
  • 一般采用默认,不需要修改

58.1.3 广播地址

  • 如果用 {netID, subnetID, hostID}({网络 ID, 子网 ID,主机 ID})表示 IPV4 地址,那么有四类的广播地址,我们用 -1 表示所有比特都为 1 的字段
  • 子网广播地址:{netID, subnetID, -1}。这类地址编排制定子网上的所有接口。例如,如果我们对 B 类地址 192.168 采用 8 位子网 ID,那么 192.168.2.255 将是 192.168.2 子网上所有接口的子网广播地址。路由器通常不转发这类广播。
  • 全部子网广播地址:{netID, -1, -1}。这类广播地址编排制定网络上的所有子网。如果说这类地址曾被用过的话,那么现在已很少见了。
  • 受限广播地址:{-1,-1,-1} 或 255.255.255.255。路由器从不转发目的地址 255.255.255.255 的 IP 数据报。

58.2 例子

58.2.1 接收者

 #include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h> int sockfd; void sig_handler(int signo)
{
if(signo == SIGINT){
printf("receiver will exited\n");
close(sockfd);
exit();
}
} int main(int argc, char *argv[])
{
if(argc < ){
fprintf(stderr, "usage: %s port\n", argv[]);
exit();
} if(signal(SIGINT, sig_handler) == SIG_ERR){
perror("signal sigint error");
exit();
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if(sockfd < ){
perror("socket error");
exit();
} struct sockaddr_in serveraddr;
memset(&serveraddr, , sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[]));
serveraddr.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < ){
perror("bind error");
exit();
} char buffer[];
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
while(){
memset(buffer, , sizeof(buffer));
memset(&clientaddr, , sizeof(clientaddr));
if(recvfrom(sockfd, buffer, sizeof(buffer), , (struct sockaddr*)&clientaddr, &len) < ){
perror("recvfrom error");
exit();
}
else {
char ip[];
inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ip, sizeof(ip));
int port = ntohs(clientaddr.sin_port);
printf("%s(%d): %s\n", ip, port, buffer);
}
} return ;
}

58.2.2 发送者

 #include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{
if(argc < ){
fprintf(stderr, "usage: %s ip port\n", argv[]);
exit();
} int sockfd = socket(AF_INET, SOCK_DGRAM, );
if(sockfd < ){
perror("socket error");
exit();
} int opt = ;
/** 采用广播方式发送 */
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)); struct sockaddr_in serveraddr;
memset(&serveraddr, , sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[]));
inet_pton(AF_INET, argv[], &serveraddr.sin_addr.s_addr); printf("I will broadcast...\n");
char *info = "hello world";
ssize_t size = strlen(info) * sizeof(char);
if(sendto(sockfd, info, size, , (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < ){
perror("sendto error");
exit();
}
else{
printf("broadcast success\n");
} close(sockfd); return ;
}

  编译运行:

  

五十八、linux 编程——UDP 编程 广播的更多相关文章

  1. Socket网络编程-UDP编程

    Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...

  2. 五十六、linux 编程——UDP 编程模型

    56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...

  3. 十、Socket之UDP编程

    UDP基础知识 UDP(User Datagram Protocol,用户数据报协议)是一个简单的.面向数据报的无连接协议,提供了快速但不一定可靠的传输服务. UDP与TCP相比主要有以下区别. 1. ...

  4. 37 - 网络编程-UDP编程

    目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议,使用UDP协议时,不需要建立连 ...

  5. C#编程(五十八)----------并行集合

    并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行访问.经常要做的就是对一些队列进行加锁-解锁,然后执行类似插入,删除等等互斥操作. .NET4提供了一些封装好的支持并行操作数据 ...

  6. 五十五 网络编程 UDP编程

    TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包.但是,能不 ...

  7. 五十七、linux 编程——UDP 编程 域名解析

    57.1 介绍 57.1.1 域名解析 57.1.2 域名解析函数 gethostent 可以获取多组,gethostbyname 只可以获取一组 /etc/hosts 文件设置了域名和 IP 的绑定 ...

  8. Linux性能优化实战学习笔记:第五十八讲

    一.上节回顾 专栏更新至今,咱们专栏最后一部分——综合案例模块也要告一段落了.很高兴看到你没有掉队,仍然在积极学习思考.实践操作,并热情地分享你在实际环境中,遇到过的各种性能问题的分析思路以及优化方法 ...

  9. linux下udp编程

    #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...

随机推荐

  1. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

    摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...

  2. Python进阶教程001内置数据类型

    关于Python的基础知识已经告一段落了,我们接下来深入的研究Python的使用方法,以及以后将要使用到的类库. 格式化字符串 Python是支持字符串的格式化输出的,在之前的学习中我们也遇到过和使用 ...

  3. .net prams关键字

    先举个例子: 代码如下: class Program { static void Main(string[] args) { Console.WriteLine(Sum(1)); Console.Wr ...

  4. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

  5. 在vultr安装和使用golang

    1.vultr可以用微信或支付宝充值,方便.好像推荐别人用还能挣美分,懒得弄了,参加了一个充10刀送50刀的活动,感觉实惠(实际用时感觉有点小贵). 2.注册登录后,控制面板上billing可查看余额 ...

  6. 《JAVA程序设计》_第六周学习总结

    一.本周学习内容 1.内部类--7.1知识 在一个类的内部定义的类成为内部类,包含内部类的类叫做外嵌类 内部类和外嵌类的关系 外嵌类的成员变量在内部类中仍然有效,内部类也可调用外嵌类中的方法 内部类的 ...

  7. 如何注册一个google账号

    注册过google账号的人都知道,在注册的过程中会需要短信验证. 可我大天朝偏偏连这个都锁了,导致根本验证不了. 所以,经过网上方法的不断尝试,排除了很多的方法:例如使用qq邮箱注册等,现在已经不能用 ...

  8. ORM简介

    ORM就是object relational mapping,对象关系映射. 将关系型数据库转化为对象来进行处理. 数据表就是一个类,表的一行就是一个对象,一行的每个字段就是属性. 忽然想到了在MVC ...

  9. 【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'

    <Python编程:从入门到实践>- 16章-16.2.5制作世界地图 import pygal 后报如标题的error 参考CSDN 解决:AttributeError: module ...

  10. Flutter之内置动画(转)

    AnimatedContainerAnimatedCrossFadeHeroAnimatedBuilderDecoratedBoxTransitionFadeTransitionPositionedT ...