-
2018-08-12 18:19:57
最近研究下UDP组播,首先上网看看各种组播的含义,以下是总结的:
多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。
在广域网上广播的时候,其中的交换机和路由器只向需要获取数据的主机复制并转发数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择地复制并传输数据,将数据仅仅传输给组内的主机。多播的这种功能,可以一次将数据发送到多个主机,又能保证不影响其他不需要(未加入组)的主机的其他通 信。
多播的地址是特定的,D类地址用于多播。D类IP地址就是多播IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:
1、局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
2、预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
3、管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
多播的程序设计使用setsockopt()函数和getsockopt()函数来实现,组播的选项是IP层的,其选项值和含义参见下表。
getsockopt()/setsockopt()的选项
含 义
IP_MULTICAST_TTL
设置多播组数据的TTL值
IP_ADD_MEMBERSHIP
在指定接口上加入组播组
IP_DROP_MEMBERSHIP
退出组播组
IP_MULTICAST_IF
获取默认接口或设置接口
IP_MULTICAST_LOOP
禁止组播数据回送
下面是写的实例代码:
client代码
#include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int main() { int iRet = 0; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); int iFlag = 0; // 0-同一台主机 1-夸主机 iRet = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&iFlag, sizeof(iFlag)); if(iRet != 0){ printf("setsockopt fail:%d", WSAGetLastError()); return -1; } sockaddr_in addr; addr.sin_addr.S_un.S_addr = inet_addr("234.2.2.2"); addr.sin_family = AF_INET; addr.sin_port = htons(9411); char strSend[1024] = {0}; static int iIdx = 0; while(1) { sprintf_s(strSend, "udp send group data:%d", iIdx++); iRet = sendto(sock, strSend, strlen(strSend) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr)); if(iRet <= 0){ printf("send fail:%d", WSAGetLastError()); }else{ printf("send data:%s\n", strSend); } Sleep(500); } closesocket(sock); WSACleanup(); return 0; }
server代码:
#include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") int main() { int iRet = 0; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr; addr.sin_family = AF_INET; //addr.sin_addr.S_un.S_addr = INADDR_ANY; addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104"); addr.sin_port = htons(9411); bool bOptval = true; iRet = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptval, sizeof(bOptval)); if(iRet != 0){ printf("setsockopt fail:%d", WSAGetLastError()); return -1; } iRet = bind(sock, (sockaddr*)&addr, sizeof(addr)); if(iRet != 0){ printf("bind fail:%d", WSAGetLastError()); return -1; } printf("socket:%d bind success\n", sock); // 加入组播 ip_mreq multiCast; //multiCast.imr_interface.S_un.S_addr = INADDR_ANY; multiCast.imr_interface.S_un.S_addr = inet_addr("192.168.0.104"); multiCast.imr_multiaddr.S_un.S_addr = inet_addr("234.2.2.2"); iRet = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast)); if(iRet != 0){ printf("setsockopt fail:%d", WSAGetLastError()); return -1; } printf("udp group start\n"); int len = sizeof(sockaddr); char strRecv[1024] = {0}; while(true) { memset(strRecv, 0, sizeof(strRecv)); iRet = recvfrom(sock, strRecv, sizeof(strRecv) - 1, 0, (sockaddr*)&addr, &len); if(iRet <= 0){ printf("recvfrom fail:%d", WSAGetLastError()); return -1; } printf("recv data:%s\n", strRecv); } closesocket(sock); WSACleanup(); return 0; }
更多相关内容 -
windows下UDP组播(多播)发送和接收程序
2020-09-19 00:00:18一个简单的C++实现UDP组播发送和接收的程序 一个简单的C++实现UDP组播发送和接收的程序 一个简单的C++实现UDP组播发送和接收的程序 一个简单的C++实现UDP组播发送和接收的程序 -
在windows下查看加入的组播组
2019-11-22 22:11:32问题描述:在windows下一个正确的组播测试程序发送与接收不成功,猜测原因是网卡过多,与组播地址绑定的IP地址不正确,但用Linux的命令netstat -g,并不被支持。搜了一下,应该用以下命令 netsh interface ipv4 show...问题描述:在windows下一个正确的组播测试程序发送与接收不成功,猜测原因是网卡过多,与组播地址绑定的IP地址不正确,但用Linux的命令netstat
-g,并不被支持。搜了一下,应该用以下命令 netsh interface ipv4 show joins查看ipv4加入的组播地址组
那么在Java中如何象C++那样指定IP地址?
实际上MulticastSocket类的初始构造函数本身就支持绑定指定IP地址,见下图。在maven代码中点击SocketAddress,可以查看其数据结构,发现SocketAddress有一个子类,inetSocketAddress,其有两个成员函数,一个是主机名(IP地址),另一个是端口,定义一SocketAddress(纯虚类)的类实例,但new的是子类inetSocketAddress,然后对其赋值。再次运行即可。
-实际上再次运行时并没有真正绑定到指定IP,还是靠把其它网卡都禁用才成功的。时间因素没有多试。
-不过,如果绑定的IP并不存在,程序还是会报错的。说明这条语句还是认真执行的。
-
C++组播和单播代码,支持windows和linux,经过72小时不间断测试
2020-09-18 09:39:11C++组播和单播代码,包括server端和client端的全部封装代码和测试代码。支持windows经过72小时性能测试,没有问题。 -
windows组播工具winsend及使用说明
2018-02-11 17:08:09windows组播工具winsend及使用说明,可以使用pc来搭建组播环境,测试组播播放器等 -
查看当前加入的组播组
2021-06-25 20:17:34Windows netsh interface ipv4 show joins Linux netstat -ganWindows
netsh interface ipv4 show joins
Linux
netstat
netstat -gan
ip
ip -h -o -4 maddr show
-h: output statistics with human readable values followed by suffix.
-o: output each record on a single line, replacing line feeds with the ‘’ character. This is convenient when you want to count records with wc(1) or to grep(1) the output.
-4: shortcut for -family inet.
maddr: multicast address. -
windows下UDP单播、广播播和组播实例
2018-08-12 18:29:18windows下使用UDP的简单实例,包括单播、广播和多播的实例代码,使用VS2010编写 -
windows终端 使用mping工具 检测组播流
2021-04-29 15:21:42下载mping工具: ... 将mping工具放在桌面的software文件夹下 具体用法: 1.使用win+R组合键,输入cmd,打开命令行工具 2.进入Desktop/software目录...如下图所示,则为正确接收组播流,其他为异常。 ...下载mping工具:
https://www.microsoft.com/en-us/download/details.aspx?id=52307
将mping工具放在桌面的software文件夹下
具体用法:
1.使用win+R组合键,输入cmd,打开命令行工具
2.进入Desktop/software目录下,执行检测
mping 239.254.2.216 5000
如下图所示,则为正确接收组播流,其他为异常。
-
组播常用配置命令
2018-07-29 16:31:15在IPTV或者广电网络部署中经常要配置组播,附件是一个组播配置中常用的命令。 -
组播测试工具(Windows)
2014-07-14 09:03:51组播测试小工具,工作环境:Windows -
UDPMulticast_Windows. UDP组播代码
2017-07-27 19:02:24VC++ Socket 组播代码 -
组播组播软件工具
2018-11-06 16:32:23软件可以提供各类组播软件使用,方便对网络设备开发者和测试者提供便捷,组播可以分类很多种组播协议报文tcp UDP IP报文等等 -
window组播工具
2018-06-06 10:50:43支持window系统的组播测试工具,可以方便模拟组播发包收包流程 -
组播测试工具.zip
2021-01-01 23:24:57组播工具 -
zigbee 组播通讯
2018-09-04 16:47:05“组播”又称“多播”,可以理解为一个人向多个人(但不是在场的所有人)说话,这样能够提高通话的效率。如果你要通知特定的某些人同一件事情,但是又不想让其他人知道,使用电话一个一个地通知就非常麻烦,而使用... -
设置IP_ADD_MEMBERSHIP最大组播组数.txt
2019-08-13 14:38:25linux网络编程中,组播通信在setsockopt接口中IP_ADD_MEMBERSHIP添加组播成员。但组播成员个数有限制,默认是20个。若需要添加更多的个数,则需要修改系统配置文件。本文档给出了怎么去修改默认的组播数。 -
基于Qt的Windows平台组播通信技术研究 (2017年)
2021-05-07 08:34:48鉴于 Qt在开发基于组播通信的应用时无法绑定到指定网卡接收数据的问题,本文提出了一种在 Windows平台下实现任意源组播和指定源组播通信的方法。本文以 Windows 下的 Qt 开发环境为基础,通过分析软件接收组播数据的... -
基于Qt的Windows平台组播通信技术研究.pdf
2021-09-04 00:17:56基于Qt的Windows平台组播通信技术研究.pdf -
Windows 10如何ping计算机名之mDNS
2021-06-25 05:39:07mDNS(参见RFC 6762)是一种用于本地主机名查询的方式,通过组播地址224.0.0.251(或ff02::fb)上的UDP端口5353运行。当需要解析.local结尾的主机名时,应当通过mDNS协议进行解析。mDNS的工作方式与普通DNS类似,但其不... -
windows无法接收到组播问题
2020-01-20 19:31:14应项目要求, 参与将一个设备发现服务从 linux 移植到 windows 上的过程, 设备发现服务通过加入特定的组播组,比如239.255.255.250,来监听对应组播组的发现报文,接收到目的地址为对应组播组的地址时,返回当前... -
windows查看端口占用情况
2020-09-29 22:59:27windows下dos命令窗口输入netstat -ano即可查看端口使用情况,如果要查看指定端口是否被占用可以使用命令netstat -ano|findstr 端口号,例如要查看8080端口号是否已经被占用就使用命令netstat -ano|findstr 8080 ... -
Windows多网卡环境接收组播包
2020-05-07 15:08:09title: “Windows多网卡环境接收组播包” subtitle: “跨过千山万水,踏遍海角天涯–I got it!” date: “2018-01-14” author: “cj” tags: multicast windows multiple-interfaces c++ 说明:本文仅针对IPv4 ... -
记录Windows10上收不到组播问题
2020-11-20 10:19:55最近两天为了做一个局域网内设备搜索功能的小工具,首先就想到用组播实现,根据网上的代码(Qt的)写好发送端和接收端,在同一个电脑上测试没有任何问题,放在同一个交换机下就不行,相互之间不能通信。 根据网上的... -
组播发送工具和接收工具
2015-01-15 16:38:39组播发送和接收2个工具,可配套使用,也可以单独使用。 接收工具,可以显示收到的包内容和数量。 有说明文档。 此资源来自互联网。 -
Linux、windows组播通信所遇坑集合
2020-05-15 10:50:45虚拟网卡导致的组播不通 很多搞代码的童鞋,会在windows上安装虚拟机捣鼓各种Linux神技。很长一段时间,爽并舒服着,突然有一天蛋疼的问题找上门了:写的组播程序怎么也通不了,程序检查了一遍又一遍,头发抓掉一把... -
UDP组播通信服务器及客户端
2013-06-19 15:17:13UDP组播通信服务器及客户端程序。基于Windows的API,在vs2005下开发。代码是开发项目模块的示例程序。具有一定的参考价值。 -
windows组播如何指定接口地址?
2013-10-14 09:32:22在unix中,组播通信时,IP_ADD_MEMBERSHIP时可通过ip_mreq::imr_interface.s_addr指定接口地址,在windows中采用WSAJoinLeaf如何指定接口地址? 指定接口地址的目的是发送时,通过指定的IP发送出去,不由系统...
-
<em>windows组播</em>源码下载<em>windows组播</em>源码下载 一个简单的客户端与服务器代码,帮助理解组播原理
-
<em>windows组播</em>工具winsend及使用说明<em>windows组播</em>工具winsend及使用说明,可以使用pc来搭建组播环境,测试组播播放器等
-
<em>windows组播</em>工具winsend及使用说明<em>windows组播</em>工具winsend及<em>windows组播</em>工具winsend使用说明
-
UDPMulticast_<em>Windows</em>. UDP<em>组播</em>代码VC++ Socket <em>组播</em>代码
-
zigbee <em>组播</em>通讯“<em>组播</em>”又称“多播”,可以理解为一个人向多个人(但不是在场的所有人)说话,这样能够提高通话的效率。如果你要通知特定的某些人同一件事情,但是又不想让其他人知道,使用电话一个一个地通知就