桌面共享UDP组播实现
组播(multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。
广播(broadcast)传输:是指在ip子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制广播传输。
优点:
1、具有同种业务的主机加入同一数据流,共享同一通道,节省了带宽和服务器的优点,具有广播的优点而又没有广播所需要的带宽。
2、服务器的总带宽不受客户端带宽的限制。由于组播协议由接收者的需求来确定是否进行数据流的转发,所以服务器端的带宽是常量,与客户端的数量无关。
3、与单播一样,组播是允许在广域网即internet上进行传输的,而广播仅仅在同一局域网上才能进行。
缺点:
1、组播与单播相比没有纠错机制,当发生错误的时候难以弥补,但是可以在应用层来实现此种功能。
2、组播的网络支持存在缺陷,需要路由器及网络协议栈的支持。
3、组播的应用主要有网上视频、网上会议等。
组播ip地址用于标识一个ip组播组。iana(internet assigned number authority)把d类地址空间分配给ip组播,其范围是从224.0.0.0到239.255.255.255。如下图所示(二进制表示),ip组播地址前四位均为1110八位组⑴ 八位组⑵ 八位组⑶ 八位组⑷1110
xxxx xxxxxxxx xxxxxxxx xxxxxxxx组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用。
224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。常用的预留组播地址列表如下:
224.0.0.0 基准地址(保留)
224.0.0.1 所有主机的地址
注:广播方和接受方的端口号相同才能收到广播
之前有写过c#局域网桌面共享软件制作(https://www.cnblogs.com/liuxiaobo93/p/3675387.html),完成了一个简易的点对点的桌面共享demo,使用的就是tcp协议,当时由于接收端接收数据用了一个比较大的byte数组来一次性接收完整张图片数据,所以有人提出了问题,为什么不用“循环接收数据以节省内存分配”呢?的确,固定缓冲区大小这种方式在设计上存在缺陷,所以我们参考rtp包的方式对图片数据进行分包传输。这样做也避免了出现大部分图片黑屏的情况。
每个数据包为定长的字节数组,定义第一位为通道标识第二位为数据标识,预定义格式如下:
/// <summary> /// 0类型通道:1图片 2命令 3音频 /// 1数据通道: /// [1图片]:0x0a图像头 0x0b图像body 0x0c图像尾 /// [2命令]:0x0e 状态命令 /// [3音频]:0x0f /// </summary>
定长则参考mtu,我们取值1460
最大传输单元(maximum transmission unit,mtu)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
//服务端创建socket serversocket = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp); serversocket.sendbuffersize = 1024 * 1024 * 5; //发送数据 groupep = new ipendpoint(ipaddress.parse(组播地址), 组播端口); serversocket.sendto(byte[], groupep); //客户端创建socket udpreceive = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp); udpreceive.receivebuffersize = 1024 * 1024 * 5; udpreceive.setsocketoption(socketoptionlevel.ip, socketoptionname.addmembership, new multicastoption(组播地址)); //绑定端口 ipendpoint ipe = new ipendpoint(客户端ip, 组播端口); udpreceive.bind(ipe); //接收数据 udpreceive.receive(byte[]);
1.配置和启动服务
2.客户端添加服务器
3.将服务器拖到空白面板,开始查看共享桌面
svn地址:https://gitee.com/xiaoboliu/desktopshare
有兴趣的同学可以一起研究,先把基本功能完善好,后面有必要的话再重构吧!
本文地址:https://www.cnblogs.com/liuxiaobo93/p/10147541.html
上一篇: 繁体中文转换为简体中文的PHP函数
下一篇: 爆笑之逗B剧场第300季
推荐阅读
-
如何应用C#实现UDP的分包组包
-
Flutter(Dart)udp组播,本地调试可以成功抓到数据包,但在apk中使用未抓到数据包
-
IP组播 MulticastChannel接口 DatagramChannel实现
-
Android设备一对多录屏直播——(UDP组播连接,Tcp传输)
-
利用VLC实现组播流服务器
-
基于kurento-one2many二次开发实现多房间直播+共享桌面+切换摄像头+聊天互动
-
Python使用socket实现组播与发送二进制数据
-
nodejs dgram模块广播+组播的实现示例
-
nodejs实现UDP组播示例方法
-
65.QT-UDP组播实现多人共享桌面(同时支持收发显示)