用udp实现广播通信

特点:

1.数据传输不用建立连接,所以不可靠(符合udp协议的特点)

2.数据的发送是面向整个子网的,任何一台在子网内的计算机都可以接收到相同的数据;

3.广播用于udp和原始IP,不能用于TCP

用途:

1.定位本地子网内的主机

前提是已知该主机位于本地子网,但是不知到他的单播地址。例如通过广播向所有子网内的主机的某端口发送数据报,如果主机有进程在该端口等待接收数据并回射数据,那么在recvfrom中会得到该主机的单播地址

2.减少分组流通

例如,多个客户主机与一个服务器主机通信的局域网中,广播的方式会尽量减少分组流通。

广播地址:

广播地址是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机号为全1的IP地址为广播地址。例如,对于 :192.168.199.0(掩码:255.255.255.0)网段,其广播地址为192.168.199.255 (255 即为2进制的11111111 ),当发出一个目的地址为192.168.199.255的分组时,它将被分发给该网段上的所有计算机。

1.直接广播地址

指Host部分全为1的广播地址。如:192.168.199.255。当某机器发出目的地址为直接广播(如:192.168.199.255)时,路由器通过查找路由表可以转发,直到该网段。

2.受限广播地址

也称本地广播地址,它不被路由发送,但会被送到相同物理网络段上的所有主机,IP地址的网络号和主机号 全为1就是地址255.255.255.255,当某机器发出目的地址为本地广播时,路由器不会转发该包。所以该包只能限制在本网段

实例:

server.cpp

#include <iostream>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
	int sockfd;
	struct sockaddr_in saddr;
	int r;
	char recvline[1025];
	struct sockaddr_in presaddr;
	socklen_t len;

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	bzero(&saddr, sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_addr.s_addr = htonl(INADDR_ANY);
	saddr.sin_port = htons(9999);
	bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
	while (1)
	{
		r = recvfrom(sockfd, recvline, sizeof(recvline), 0 , (struct sockaddr*)&presaddr, &len);
		if (r <= 0)
		{
			perror("");
			exit(-1);
		}
		recvline[r] = 0;
		cout <<"recvfrom "<< inet_ntoa(presaddr.sin_addr) <<" " << recvline << endl;
	}
	return 0;
}

client.cpp

#include <iostream>
#include <strings.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
	int sockfd;
	struct sockaddr_in des_addr;
	int r;
	char sendline[1024] = {"Hello"};
	const int on = 1;

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); //设置套接字选项
	bzero(&des_addr, sizeof(des_addr));
	des_addr.sin_family = AF_INET;
	des_addr.sin_addr.s_addr = inet_addr("192.168.199.255"); //广播地址
	des_addr.sin_port = htons(9999);
	r = sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&des_addr, sizeof(des_addr));
	if (r <= 0)
	{
		perror("");
		exit(-1);
	}
	cout << "finish" << endl;
	return 0;
}

问题:

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用UDP广播应用作为例子。如果网内有50个主机,但仅有20个参与该应用,每次这20个主机中的一个发送UDP广播数据时,其余30个主机不得不处理这些广播数据报。一直到UDP层,收到的UDP广播数据报才会被丢弃。这30个主机丢弃UDP广播数据报是因为这些主机没有使用这个目的端口。

用udp实现广播通信

时间: 2024-10-20 06:57:38

用udp实现广播通信的相关文章

uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)

目前移植uip,发现UDP 服务器模式下,必须指定本地端口以及客户端端口,否则只能讲客户端端口设置为0,才能接收任意端口的数据,但是无法发送数据,因为此时客户端端口设置为0了,我通过将原始数据包中的客户端端口保存下来,并且在发送的时候将客户端端口替换为指定的端口,发送完成之后又设置为0,这样就实现了向任意客户端端口发送数据. uip.c if(uip_udp_conn->lport != 0 && UDPBUF->destport == uip_udp_conn->lpo

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

uip UDP客户端模式通信移植,本地端口可以随机

目前移植了UDP客户端模式,测试使用广播地址. //udp_client.c /************************************************************************************************************* * 文件名: udp_client.c * 功能: uIP UDP客户端相关函数 * 作者: [email protected] * 创建时间: 2014-06-06 * 最后修改时间: 2014-0

uip UDP server广播模式(client能够随意port,而且主动向client发送数据)

眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clientport设置为0了,我通过将原始数据包中的clientport保存下来,而且在发送的时候将clientport替换为指定的port,发送完毕之后又设置为0,这样就实现了向随意clientport发送数据. uip.c if(uip_udp_conn->lport != 0 && UDP

Netty in Action (二十四) 第十三章节 UDP的广播事件

本章内容包括: 1)UDP的总览 2)广播应用的一个简单示例 到目前为止,我们使用的所有例子都是基于连接形式的协议,例如TCP,在这个章节中,我们将会聚焦于无连接x形式的协议(User Datagram Protocol UDP),这个协议常常使用于对性能要求极其高但又可以允许少量的丢包的情况存在 我们先讲解一下UDP的概念,讲解一下它的特性和限制,接下来我们会描述一下这个章节示例应用的业务背景,这个示例将会很好的说明如何使用UDP协议的广播特性,我们也会利用解码器和编码器来处理一个POJO,在

27.Socket,TCP,UDP,HTTP基本通信原理

Socket,TCP,UDP,HTTP基本通信原理(摘自百度): TCP.UDP,HTTP 底层通信都是通过 socket 套接字实现 网络上不同的计算机,也可以通信,那么就得使用网络套接字(socket). socket就是在不同计算机之间进行通信的一个抽象. 他工作于TCP/IP协议中应用层和传输层之间的一个抽象  如图所示: 1.Socket 是对 TCP/IP 协议族的一种封装,是应用层与TCP/IP协议族通信的中间软件抽象层.从设计模式的角度看来,Socket其实就是一个门面模式,它把

VM虚拟机虚拟网卡对于UDP发送广播包的影响

近期做一个项目需要用到UDP发送广播包给嵌入式端的程序并要求其作出相应的反馈,一开始非常顺利.但到了测试通用性的阶段发现有的电脑无法发送出UDP广播包,进而也就是无法跟嵌入式端交互(发现并将问题锁定在此就已经花费了非常非常非常多的心血!其中可以ping通嵌入式端这点让人纠结了很久).在问题锁定了之后第一个怀疑的是防火墙,然后是杀毒软件等等,将电脑裸奔满怀希望开启软件之后依然是那副尿性.最后百无聊赖百度了下,在一篇博客的一小段中提到了VM虚拟机的虚拟网络对于UDP发送广播包有影响,突然之间恍然大悟

&#9654;链路层第三弹&#9664; 两种信道下的数据链路层【下】广播通信CSMA/CD

两种信道情况下的数据链路层     之 广播信道的数据链路层---CSMA/CD(载波监听多路访问/冲突检测) l  局域网概念 在局域网中用到的就是广播通信,所以以局域网的通信来讲解广播信道的数据链路层特点.在学习广播通信 特点之前,先来了解一下局域网. n 局域网的分类 所有的PC机接到中间设备核心上.但是如果核心设备一点坏掉了,则所有PC机都将受到影响.虽然核心坏掉会出现问题,但是一般核 心不会坏,坏的一般是线路,星形网中线路的毁坏并不会影响其他PC的工作,所以星形网在局域网中用的比较多.

Java UDP 中 广播的 感悟

多播:很好 但是   有 风险 广播 是有一定 风险的,如果所有的数据 都进行广播的话,有些人 并不像收到 这些数据,就会造成 网络 阻塞. 网络 风暴 后果不堪设想,所有的数据都阻塞, 就像北京的 堵车一样,谁也 别想发送数据. 所以在 广域网里,基本很少用到 广播,就算 用到 的话 也会很小心的. Java UDP 中 广播的 感悟,布布扣,bubuko.com