如果想发送广播到目前为止只能使用AF_INET, SOCK_DGRAM,也就是说只能采用基于IPV4的UDP协议才能发送广播。
IP地址有32位组成,如果想向某个网段发送广播,只需要那个发送的IP地址的主机号改成全1即可。比如大家最常用的局域网内部广播,我的网络地址为192.168.1.xxx。因此我只需要发送地址改为192.168.1.255.另外路由不转发广播,也就是说:处于192.168.1.xxx网段的广播是不会发送到192.168.2.xxx网段上。这也是说主机192.168.1.221如果想发送192.168.2.xxx的广播是行不通的。
代码就很简单的,但是有点要注意的是:必须通过套接口选项SO_BROADCAST设置,明确的告诉路由,你要发送的是广播,不然是无法发送出去。
发送代码:
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
int sockfd;
struct sockaddr_in serv_socket;
int maxfdpl;
char send[] = "hello world";
if(argc != 2) {
printf("please input port");
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);/发送广播,必须采用AF_INET,SOCK_DGRAM才可以
bzero(&serv_socket, sizeof(serv_socket));
serv_socket.sin_family = AF_INET;
serv_socket.sin_port = htons(atoi(argv[1]));
const int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));//设置套接口选项SO_BROADCAST明确告诉路由发送的是广播
inet_pton(AF_INET, "192.168.1.255", &serv_socket.sin_addr);
int temp = sendto(sockfd, send, sizeof(send), 0, (struct sockaddr *)&serv_socket, sizeof(struct sockaddr_in));
if(temp == -1)
printf("system message:send failed\n");
}
接受代码:
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/select.h"
#include "sys/poll.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
int sockfd;
struct sockaddr_in serv_socket;
struct sockaddr_in * client_socket = NULL;
char send[MAXSIZE + 1];
char recv[MAXSIZE + 1];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serv_socket, sizeof(serv_socket));
serv_socket.sin_family = AF_INET;
serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
serv_socket.sin_port = htons(atoi(argv[1]));
bind(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
socklen_t len = sizeof(client_socket);
client_socket = (struct sockaddr_in *) malloc (sizeof(struct sockaddr_in));
int n = recvfrom(sockfd, recv, MAXSIZE, 0, (struct sockaddr *)client_socket, &len);
recv[n] = '\0';
printf("client message:%s\n", recv);
}
另外唯一要注意的是:发送的广播时候传输的数据不应过长,因为广播的是不会被分片,也就是说如果超过了MTU,数据包会被丢弃。不分片的原因是因为设计者认为广播已经给网络带来了很大的负担,没必要再通过分片将这种负担扩大数倍。
另外,高层的SOCKET也会处理,至少在我所执行的fedora环境下,当我试图把发送的内容buf扩大至10000个字符时候,并没有出现因不分片而导致的错误,接受端仍然接受到了数据,不过数据是被截断后的数据(要远远小于10000个字符),我怀疑原因:可能是linux内核在发现要发送广播,而数据又过长需要分片的时候,直接将数据截断变成无需分片的大小。
分享到:
相关推荐
首先,文件标题为 "3GPP TS 23.038",文档描述为 "3GPP TS 23.038 version 8.3.0 Release 8"。这里,“3GPP”是第三代合作伙伴计划(3rd Generation Partnership Project)的缩写,它是一个全球性组织,负责制定移动...
Release 16在Release 15的基础上进一步优化和增强了5G的功能,增加了工业物联网(IIoT)和增强的多播广播服务(eMBMS)等特性,而Release 17则重点发展了5G Advanced的能力。 文件中还提到了一些组织和商标信息,...
23. 广播电视现场报道:记者直接在新闻现场进行报道,结合现场实况和采访,增强报道的即时性和现场感。 24. 现场报道的题材选择要求事件的时间、空间集中,且充满悬念和不确定性,让观众能跟随记者一同探索未知。 ...
23. 广播电视新闻结构要求:单一线索、层次清晰、核心信息突出,确保信息传达的有效性。 24. 广播电视消息定义:快速及时、简洁扼要地报道新闻事实,利用视听媒体特性传递信息。 以上是全国广电系统记者编辑资格...
23 本方案详尽介绍了**中学的"DMB+无线数字多媒体广播信息发布系统"的建设规划。DMB+技术是一种先进的数字广播技术,它结合了多媒体信息传输的能力,能够提供高质量的声音和图像,极大地提升了校园广播的信息传播...
23. 广播风暴抑制功能:支持广播风暴抑制功能,防止过多的广播、组播数据在网络泛洪,增强网络健壮性。 24. 协议支持:支持 G.8032 (ERPS)、IEEE802.3、IEEE802.3u、IEEE802.3z、IEEE802.3x、IEEE802.3ad、IEEE802....
KXT23矿用IP网络广播系统用户手册 本文档是关于KXT23矿用IP网络广播系统用户手册的详细指南,旨在帮助用户快速掌握该系统的安装、配置、操作和维护。下面是该手册的主要知识点: 概述 KXT23矿用IP网络广播系统是...
23. Intent.ACTION_MEDIA_CHECKING:插入外部储存装置时的广播 24. Intent.ACTION_MEDIA_EJECT:拔掉外部大容量储存设备时的广播 25. Intent.ACTION_MEDIA_MOUNTED:插入 SD 卡并且已正确安装时的广播 26. Intent....
23. 广播系统精准时间控制:通过配备原则时间系统或卫星全球原则时间信号系统实现。 24. 建筑设备监控系统对给排水设备的要求:监控给排水泵的运行状态,包括故障报警和启停控制。 25. 智能化集成系统定义:通过...
此外,如果应用运行在Android 6.0(API级别23)及以上,还需要在运行时请求`ACCESS_WIFI_STATE`和`CHANGE_WIFI_MULTICAST_STATE`权限。 总结来说,Android发送UDP广播涉及到网络编程基础,包括UDP套接字的创建、...
自Android 6.0(API level 23)起,某些系统广播需要在运行时申请权限。例如,如果你的广播涉及到网络状态变化,需要`ACCESS_NETWORK_STATE`权限。此外,从Android 8.0(API level 26)开始,系统默认禁止后台服务...
### KXT23矿用IP网络广播系统方案 #### 1. 概述 KXT23矿用IP网络广播系统是一种专为煤矿井下设计的现代化广播解决方案,旨在克服传统模拟音频广播系统的诸多局限性。该系统充分利用了当前网络技术的优势,能够实现...
在Android 6.0(API 23)及以上版本,由于运行时权限的引入,我们还需要在运行时请求存储权限,否则可能无法正常访问拍摄的照片。 ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission....
自Android 6.0(API级别23)起,部分系统权限需要在运行时请求。如果需要在后台发送通知,可能需要请求“SYSTEM_ALERT_WINDOW”或“ACCESS_NOTIFICATION_POLICY”权限。 综上所述,"Android 利用广播发送通知"涉及...
23. Intent.ACTION_MEDIA_CHECKING:当插入外部储存装置时,系统会发出此广播,通知相关应用程序进行相应的处理。 知识点:外部储存装置是 Android 系统中的一种外部存储设备,应用程序可以根据这个事件来进行存储...
3GPP TS 23.501 V16.1.0(2019-06 年)5G 系统的系统架构; 第二阶段 (版本 16) 目录 前言 15 1 范围 16 2 参考文献 16 3 定义和缩写 20 3.1 定义 20 3.2 缩写 24 4 架构(architecture)模型和概念 26 4.1 一般...
要监听屏幕状态,需要在AndroidManifest.xml中添加`ACCESS_FINE_LOCATION`权限,因为从Android 6.0(API级别23)开始,对敏感权限的请求需要在运行时进行: ```xml <uses-permission android:name="android....