首页 程序笔记 在C#中实现局域网中不在同一子网的两个机器双向UDP组播

在C#中实现局域网中不在同一子网的两个机器双向UDP组播

需求描述

在设备搜索相关的协议中,UDP被广泛使用,当不知道对方真实IP地址,并且可能两台机器不在同一个子网下,此时就不能直接使用UDP通讯,换句话说,不在相同子网下的两台机器(例如如子网掩码为255.255.255.0,机器A:192.168.11.11,机器B:192.168.1.101),普通的TCP或UDP发送都无法直接到达对方,此时就需要使用UDP的组播模式。接下来就介绍一下在C#中双向组播的实现。

实现代码

Server端

使用UDP组播,并没有服务端和客户端之分,只是在具体应用中,根据应用具体的逻辑,可以将一端的业务逻辑划分为服务端,另一端为客户端。因此,这里Server端的代码如下:

    Socket udpServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    udpServerSocket.ReceiveTimeout = 1000;
    udpServerSocket.MulticastLoopback = false;  //禁用本地组播回环,否则自己发送的组播消息自己也会收到,形成死循环
    udpServerSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,   //加入组播
                                                            new MulticastOption(IPAddress.Parse(224.0.0.22), IPAddress.Any));

    udpServerSocket.Bind(new IPEndPoint(IPAddress.Any, 18000));
            
    byte[] buf = new byte[1024];
            
    while (true)
    {
        EndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
        int recvCount = udpServerSocket.ReceiveFrom(buf, ref endpoint);
        Console.WriteLine(Receive {0} bytes from {1}., recvCount, endpoint);
        Console.WriteLine(Receive message: {0}, Encoding.Default.GetString(buf));
        
        var txEdp = new IPEndPoint(IPAddress.Parse(224.0.0.22), 18000);
        udpServerSocket.SendTo(Encoding.Default.GetBytes(Hi!), txEdp);
       Console.WriteLine(Send \Hi!\ to {0}., txEdp);
    }

Client端

客户端的代码如下:

    Socket UDPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    UDPSocket.ReceiveTimeout = 10000;
    UDPSocket.ExclusiveAddressUse = false;
    UDPSocket.MulticastLoopback = false;
    UDPSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    UDPSocket.Bind(new IPEndPoint(IPAddress.Any, 18000));
    UDPSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(224.0.0.22)));

    var txEdp = new IPEndPoint(IPAddress.Parse(224.0.0.22), 18000);
    byte[] buf = new byte[1024];
    while (true)
    {
        UDPSocket.SendTo(Encoding.Default.GetBytes(Hello!), txEdp);
        Console.WriteLine(Send \Hello!\ to {0}., txEdp);

        EndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
        int recvCount = UDPSocket.ReceiveFrom(buf, ref endpoint);

        Console.WriteLine(Receive {0} bytes from {1}., recvCount, endpoint);
        Console.WriteLine(Receive message: {0}, Encoding.Default.GetString(buf));
        Thread.Sleep(1000);
    }

运行结果

运行环境:
机器A:Ubuntu虚拟机,桥接网卡,IP地址为静态指定:192.168.11.11
机器B:Windows的机器,与机器A桥接网卡连接同一交换机,IP机制为动态获取:192.168.1.101
以上两个机器,如果是简单的TCP或UDP是无法通讯的,使用以上示例代码运行结果如下:

  • 服务端:
Receive 6 bytes from 192.168.1.101:18061.
Receive message: Hello!
Send Hi! to 224.0.0.22:18000.
  • 客户端:
Send Hello! to 224.0.0.61:18000.
Receive 3 bytes from 192.168.11.11:18000.
Receive message: Hi! 
......

从运行结果可以看到,机器A和机器B可以正常实现双向通讯。

站星网

需求描述 在设备搜索相关的协议中,UDP被广泛使用,当不知道对方真实IP地址,并且可能两台机器不在同一个子..

为您推荐

TikTok玩具赛道惊现“爆单机器”,28天成交63700单!

来源:TT123跨境电商作者:TT123跨境电商每年的 11 月底至圣诞节期间,北美地区流行举办“白象礼物交换派对”(White Elephant Gift Exchange),派对的核心规则就是相互赠送无用、古怪、令人发笑的礼物以活跃气氛。..

四个月,AI为主,人为辅,一款产品两个知识库!

有句老话:人人都是产品经理;有句新话:AI加持下,人人可做独立开发一、引子2023年开始接触ChatGPT,当时只能算是一个聊天机器人。如今两年过去了,AI这个赛道已经百花齐放。它变得越来越智能,能干的事情也越来越..

程序员是不是都要两个显示器?两个键盘?

作为一个在程序员这条路上摸爬滚打了十多年的老码农,从24岁机械专业毕业被调剂到电子开始接触嵌入式开发,到后来在世界500强外企做汽车电子,再到28岁开始自媒体创业,我想和大家聊聊程序员的"装备"问题。每次看到..

两个北航学霸打造的百亿品牌,靠电动车年入143亿

来源:兔克出海作者:兔克出海“如果苹果联合创始人沃兹尼亚克困在荒岛上,只能带一样东西,那一定是 Segway 平衡车。”这句略带调侃的段子,折射出 Segway 品牌在海外科技圈的独特地位。沃兹尼亚克(左二)图源:网..

值得探索的 8 个机器学习 JavaScript 框架

JavaScript开发人员倾向于寻找可用于机器学习模型训练的JavaScript框架。下面是一些机器学习算法,基于这些算法可以使用本文中列出的不同JavaScript框架来模型训练:简单的线性回归多变量线性回归逻辑回归朴素贝叶斯..

使用 html2canvas 实现截图功能

html2canvas 是一个开源的 JavaScript 库,用于将网页上的 HTML 元素渲染成图像。它通过遍历页面的 DOM 树和计算样式,然后将其绘制到 <canvas> 元素上,最终生成图片。该库不依赖服务器端,而是通过浏览器端的 Java..

网站统计中的访问信息收集的前端实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascri..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

C#使用 Attribute 实现 AOP 功能

在 C# 中,通过自定义 Attribute 并结合一些技术(如动态代理、反射等)可以实现 AOP(面向切面编程)。AOP 通常用于日志记录、性能监控、权限验证等横切关注点。以下是一个使用 C# Attribute 实现 AOP 功能的示例。..

使用CSS columns-visibility实现砌体布局

CSS的 columns 属性(如 columns、column-count 和 column-width)通常用于多列文本布局,而不是直接用于砌体布局。然而,结合 columns 和 visibility 属性,可以在某些情况下实现类似砌体布局的效果,虽然它并不完..

js使用IntersectionObserver实现锚点在当前页面视口时导读高亮

在 JavaScript 中可以通过监听页面滚动事件,检查每个锚点的位置,并根据当前滚动位置高亮相应的导航项,从而实现页面内锚点链接的导读高亮效果。交叉观察器 API(Intersection Observer API)提供了一种异步检测目..

js使用scroll事件实现锚点滚动到页面顶部时导航高亮

在 JavaScript 中,可以通过监听页面滚动事件,并判断页面顶部与各个锚点的距离来实现导航高亮效果。当某个锚点的内容块滚动到页面顶部时,自动高亮相应的导航项。以下是实现方式:1. HTML 结构假设我们有多个内容区..

ASP.NET Core实现多语言本地化Web应用程序

构建全球可访问的网站和应用程序需要对内容进行适当的本地化,以吸引来自不同文化和地区的用户。ASP.NET Core 提供强大的本地化支持,以用户首选的语言和格式呈现内容。在本综合指南中,我们将探索 ASP.NET Core 中..

c#获取两个数组或集合的交集或差集

c#获取两个数组或集合的交集或差集。 不要使用循环,效率肯定低。C#有现成的高性能的获取数组或集合的交集或差集方法:Intersect和Except。 使用Intersect和Except获取两个数组的交集或者差集时性能很高,我测试两个..

支付宝第三方支付平台对接原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..

类似php iconv的函数功能,C#实现方法

在与一个第三方接口对接时,发现对方无法用GZip解压我发过去的数据,看了对方PHP的示例代码,发现对方使用的是PHP的$file = iconv("IOS-8859-1","UTF-8",gzencode($data_json));大致意思是要先压缩,在把压缩的数组..

c#实现与Java无差异的GZip压缩和GZip解压缩

c#实现与Java无差异的GZip压缩和GZip解压缩,其中有个坑就是GZip压缩的时候,只有在GZipStream在Dispose后调应对应MemoryStream.ToArray()所得到的结果才是正确的压缩数据。如果在zipStream.Write(bytes, 0, bytes.L..

.NET Core 管道模型中间件及管道模拟实现

管道,PipelineASP.NET Core 路由,认证,绘画,缓存,都是由管道来处理的中间件。MVC WEB API,都是建立在某个特殊的中间件之上。MVC,路由的中间件,请求地址和控制器之间的映射,在此基础上实现了实例化控制器,..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制
塔尊佛教网|借视频之舟,渡烦恼之海 Tazun.Cn佛教音乐网 - 海量佛乐、梵呗、禅音在线试听与下载经书网 - 以音声作佛事,聆听与观想的修学园地 jingshu.net佛教导航 - 开启智慧之旅,连接十方法缘 | fjdh.org.cn智慧莲华 - 赋能寺院数字化升级,打造智慧弘道平台趣知道 - 提问与分享,人人都是知识分享家 | Quzhidao.Com地藏孝亲网--南无大愿地藏王菩萨给农网地藏经顺运堂 - 专业家居风水布局,八字命理分析,助您家宅兴旺,运势亨通弘善佛教网-传播正信正知佛法的佛教网站国学在线 - 国学网,国学学校,国学经典,国学地图品读名篇佳句,涵养诗意人生 - 古诗词网哦嘿养殖网 - 热门乡村养殖发展项目_养殖技术知识分享生死书 - 佛教文化传承与生命智慧探索平台地藏论坛-佛教网络净土_佛法综合社区生死书生死书