socket udp广播和多播的简单实现
UDP广播与多播
作者:legend
QQ:1327706646
使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。
通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。
UDP广播
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。
广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。
其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。
UDP多播
- 同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。下面将给出一个简单的多播接受数据的例子:
- // 发送端
- #include <iostream>
- #include <stdio.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- using namespace std;
- int main()
- {
- setvbuf(stdout, NULL, _IONBF, 0);
- fflush(stdout);
- int sock = -1;
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- {
- cout<<"socket error"<<endl;
- return false;
- }
- const int opt = 1;
- //设置该套接字为广播类型,
- int nb = 0;
- nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
- if(nb == -1)
- {
- cout<<"set socket error..."<<endl;
- return false;
- }
- struct sockaddr_in addrto;
- bzero(&addrto, sizeof(struct sockaddr_in));
- addrto.sin_family=AF_INET;
- addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
- addrto.sin_port=htons(6000);
- int nlen=sizeof(addrto);
- while(1)
- {
- sleep(1);
- //从广播地址发送消息
- char smsg[] = {"abcdef"};
- int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);
- if(ret<0)
- {
- cout<<"send error...."<<ret<<endl;
- }
- else
- {
- printf("ok ");
- }
- }
- return 0;
- }
- // 接收端 http://blog.csdn.net/robertkun
- #include <iostream>
- #include <stdio.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- using namespace std;
- int main()
- {
- setvbuf(stdout, NULL, _IONBF, 0);
- fflush(stdout);
- // 绑定地址
- struct sockaddr_in addrto;
- bzero(&addrto, sizeof(struct sockaddr_in));
- addrto.sin_family = AF_INET;
- addrto.sin_addr.s_addr = htonl(INADDR_ANY);
- addrto.sin_port = htons(6000);
- // 广播地址
- struct sockaddr_in from;
- bzero(&from, sizeof(struct sockaddr_in));
- from.sin_family = AF_INET;
- from.sin_addr.s_addr = htonl(INADDR_ANY);
- from.sin_port = htons(6000);
- int sock = -1;
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- {
- cout<<"socket error"<<endl;
- return false;
- }
- const int opt = 1;
- //设置该套接字为广播类型,
- int nb = 0;
- nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
- if(nb == -1)
- {
- cout<<"set socket error..."<<endl;
- return false;
- }
- if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1)
- {
- cout<<"bind error..."<<endl;
- return false;
- }
- int len = sizeof(sockaddr_in);
- char smsg[100] = {0};
- while(1)
- {
- //从广播地址接受消息
- int ret=recvfrom(sock, smsg, 100, 0, (struct sockaddr*)&from,(socklen_t*)&len);
- if(ret<=0)
- {
- cout<<"read error...."<<sock<<endl;
- }
- else
- {
- printf("%s\t", smsg);
- }
- sleep(1);
- }
- return 0;
- }
- 自已在Linux虚拟机下测试可以成功, 前提是要把主机设置在同一网段内, 还有就是不要忘记关闭Linux的防火墙.. 可以使用setup命令进行设置。
(我在测试的时候只能发送不收接收,折磨了我半天,后来才想到是Linux防火墙的问题。。)
关于虚拟机的网卡配置,建议选择桥接模式。NAT的模式的话,是受限制的,可能会收不到广播消息。
具体的参考网上的文章吧。。
socket udp广播和多播的简单实现的更多相关文章
- UDP广播与多播
UDP广播与多播 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去.至于服务 ...
- c# socket udp广播
一.广播消息 由于Tcp是有连接的,所以不能用来发送广播消息.发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息.广播消息的目的IP地址是一种特殊IP地址,称为广播地址.广播地址由IP地址 ...
- udp广播和多播
使用UDP协议进行信息的传输之前不需要建立链接, 客户端向服务器发送信息时,客户端只需要给出服务器的ip地址和端口号,可以发送信息.至于服务器端是否存在,是否能够收到该报文,客户端根本不用管. 广播( ...
- TCP/IP||UDP广播和多播
1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...
- Netty实战十三之使用UDP广播事件
1.UDP的基础知识 我们将会把重点放在一个无连接协议即用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据报丢失的情况下. 面向连接的传输(如TCP)管理了两个网络端点之间的连接 ...
- android 发送UDP广播,搜寻server建立socket链接
应用场景:client(手机.pc)须要搜寻所在局域网内的server并获得server地址. 方法简单介绍:client发送UDP广播,服务收到广播后得到clientip地址,然后向client发送 ...
- UDP 单播、广播和多播
阅读目录(Content) 一.UDP广播 二.UDP多播 1.多播(组播)的概念 2.广域网的多播 三.UDP广播与单播 广播与单播的比较 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就 ...
- UDP 单播、广播、多播
一.UDP广播 广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机.值得强调的是:本地广播信息是不会被路由器转发.当然 ...
- udp单播,广播,多播实现(ReceiveFromAsync,SendToAsync)
注意:客户端和服务器实现基本一致,本地host和port和多播的host和port可以一样 (1)多播 1.将本地host加入多播组中,只有加入多播组的成员才能接受同组的节点发送的多播 Multica ...
随机推荐
- Qt Multimedia Backends(多媒体后端)翻译
目录 MediaService plugins 媒体服务插件 不同后端支持的媒体播放器功能: 后端支持的摄像头(相机)功能 后端支持的音频解码功能 Audio plugins 音频插件 原文地址: Q ...
- cocos2d-x 源代码分析 : EventDispatcher、EventListener、Event 源代码分析 (新触摸机制,新的NotificationCenter机制)
源代码版本号来自3.x,转载请注明 cocos2d-x 源代码分析总文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结 ...
- 每秒处理3百万请求的Web集群搭建-用 LVS 搭建一个负载均衡集群
这篇文章是<打造3百万次请求/秒的高性能服务器集群>系列的第3部分,有关于性能测试工具以及优化WEB服务器部分的内容请参看以前的文章. 本文基于你已经优化好服务器以及网络协议栈的基础之上, ...
- C#:Ini文件操作(待补充)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- hive 分位数函数 percentile(col, p)
注意在偶数情况下,中位数会存在小数,特别注意! hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percentile(col, p).percenti ...
- 批量修改图像的大小 Python PIL
#-*-coding:utf-8-*- import os import os.path from PIL import Image import time def ResizeImage(filei ...
- macbook中使用彩色的ls
1.首先,macbook中原装的ls和gnu的ls是不相同的,所以,要下载安装正牌ls brew install coreutils //gnu ls 在里面 2.因为和mac的ls有冲突,所以,co ...
- 如何快速掌握man手册的使用
man手册内容详细,解释到位,因为好多都是软件的原创者自己写的说明文档,当然是第一手的资料.但是,有几个难点需要克服: 1.英文不易阅读,通常我是先在书上或者网络上找到某个命令的详细说明和解释,然后在 ...
- UIWebView和UICollectionViewController的使用
UIWebView和UICollectionViewController的使用 UIWebView UIWebView是iOS内置的浏览器的控件, 可以浏览网页, 打开文档等 .系统自带的Safari ...
- 【转】shell pipe与输入输出重定向的区别
http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html