C#实现 UDP简单广播

2023-05-16

[csharp] view plain copy print ?
  1. 代码  
  2.   
  3. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->    class Program  
  4.     {  
  5.   
  6.         static bool connecting = true;  
  7.         static void Main()  
  8.         {  
  9.             Received();  
  10.             while (connecting)  
  11.             {  
  12.                 string content = Console.ReadLine();  
  13.                 if (content.Length > 0)  
  14.                 {  
  15.                     if (string.Compare(content, "<Stop>"true) == 0)  
  16.                     {  
  17.                         Console.WriteLine("关闭...");  
  18.                         connecting = false;  
  19.                     }  
  20.                     else  
  21.                     {  
  22.                         Send(content);  
  23.                     }  
  24.                 }  
  25.             }  
  26.             Console.ReadKey();  
  27.         }  
  28.   
  29.         public static void Send(string content)  
  30.         {  
  31.             Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  32.             //IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255   
  33.             IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.100.255"), 9050);  
  34.            // string hostname = Dns.GetHostName();  
  35.             byte[] data = Encoding.ASCII.GetBytes(content);  
  36.             sock.SetSocketOption(SocketOptionLevel.Socket,  
  37.             SocketOptionName.Broadcast, 1);  
  38.             //sock.SendTo(data, iep1);  
  39.             sock.SendTo(data, iep2);  
  40.             sock.Close();  
  41.         }  
  42.   
  43.         public static void Received()  
  44.         {  
  45.             ThreadPool.QueueUserWorkItem((x) =>  
  46.             {  
  47.                 Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  48.                 IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);  
  49.                 sock.Bind(iep);  
  50.                 EndPoint ep = (EndPoint)iep;  
  51.   
  52.                 byte[] data;  
  53.                 int recv;  
  54.                 string stringData;  
  55.                 Console.WriteLine("接听开启...");  
  56.                 while (connecting)  
  57.                 {  
  58.                     data = new byte[1024];  
  59.                     recv = sock.ReceiveFrom(data, ref ep);  
  60.                     stringData = Encoding.ASCII.GetString(data, 0, recv);  
  61.                     Console.WriteLine("信息: {0} 来自: {1}", stringData, ep.ToString());  
  62.                 }  
  63.                 Console.WriteLine("接听关闭...");  
  64.                 sock.Close();  
  65.             });  
  66.         }  
  67.   
  68.     }  
代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->    class Program
    {

        static bool connecting = true;
        static void Main()
        {
            Received();
            while (connecting)
            {
                string content = Console.ReadLine();
                if (content.Length > 0)
                {
                    if (string.Compare(content, "<Stop>", true) == 0)
                    {
                        Console.WriteLine("关闭...");
                        connecting = false;
                    }
                    else
                    {
                        Send(content);
                    }
                }
            }
            Console.ReadKey();
        }

        public static void Send(string content)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255 
            IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.100.255"), 9050);
           // string hostname = Dns.GetHostName();
            byte[] data = Encoding.ASCII.GetBytes(content);
            sock.SetSocketOption(SocketOptionLevel.Socket,
            SocketOptionName.Broadcast, 1);
            //sock.SendTo(data, iep1);
            sock.SendTo(data, iep2);
            sock.Close();
        }

        public static void Received()
        {
            ThreadPool.QueueUserWorkItem((x) =>
            {
                Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
                sock.Bind(iep);
                EndPoint ep = (EndPoint)iep;

                byte[] data;
                int recv;
                string stringData;
                Console.WriteLine("接听开启...");
                while (connecting)
                {
                    data = new byte[1024];
                    recv = sock.ReceiveFrom(data, ref ep);
                    stringData = Encoding.ASCII.GetString(data, 0, recv);
                    Console.WriteLine("信息: {0} 来自: {1}", stringData, ep.ToString());
                }
                Console.WriteLine("接听关闭...");
                sock.Close();
            });
        }

    }


 

从原理角度考虑,广播和单向定点发送没什么区别,献上一段小代码(来自msdn),基本很详细的说了如何广播式发送udp数据包:

 

[csharp] view plain copy print ?
  1. using   System;     
  2.   using   System.Net;     
  3.   using   System.Net.Sockets;     
  4.   using   System.Text;     
  5.       
  6.   public   class   UDPMulticastSender   {     
  7.       
  8.           private   static   IPAddress   GroupAddress   =       
  9.                   IPAddress.Parse("224.168.100.2");     
  10.           private   static   int   GroupPort   =   11000;     
  11.               
  12.           private   static   void   Send(   String   message)   {     
  13.                   UdpClient   sender   =   new   UdpClient();     
  14.                   IPEndPoint   groupEP   =   new   IPEndPoint(GroupAddress,GroupPort);     
  15.       
  16.                   try   {     
  17.                           Console.WriteLine("Sending   datagram   :   {0}",   message);     
  18.                           byte[]   bytes   =   Encoding.ASCII.GetBytes(message);     
  19.       
  20.                           sender.Send(bytes,   bytes.Length,   groupEP);     
  21.                               
  22.                           sender.Close();     
  23.                               
  24.                   }   catch   (Exception   e)   {     
  25.                           Console.WriteLine(e.ToString());     
  26.                   }     
  27.                       
  28.           }     
  29.       
  30.           public   static   int   Main(String[]   args)   {     
  31.                   Send(args[0]);     
  32.       
  33.                   return   0;     
  34.           }   
using   System;   
  using   System.Net;   
  using   System.Net.Sockets;   
  using   System.Text;   
    
  public   class   UDPMulticastSender   {   
    
          private   static   IPAddress   GroupAddress   =     
                  IPAddress.Parse("224.168.100.2");   
          private   static   int   GroupPort   =   11000;   
            
          private   static   void   Send(   String   message)   {   
                  UdpClient   sender   =   new   UdpClient();   
                  IPEndPoint   groupEP   =   new   IPEndPoint(GroupAddress,GroupPort);   
    
                  try   {   
                          Console.WriteLine("Sending   datagram   :   {0}",   message);   
                          byte[]   bytes   =   Encoding.ASCII.GetBytes(message);   
    
                          sender.Send(bytes,   bytes.Length,   groupEP);   
                            
                          sender.Close();   
                            
                  }   catch   (Exception   e)   {   
                          Console.WriteLine(e.ToString());   
                  }   
                    
          }   
    
          public   static   int   Main(String[]   args)   {   
                  Send(args[0]);   
    
                  return   0;   
          } 


 单播(点对点) 通信,即网络中单一的源节点发送封包到单一的上的节点。

    在广播通信中, 网络层提供了将封包从一个节点发送到所有其他节点的服务。

    利用广播(broadcast) 可以将数据发送给本地子网上的每个机器。广播的缺点是如果多个进程都发送广播数据, 网络就会阻塞。

1. 服务端

[csharp] view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Net.Sockets;  
  5. using System.Net;  
  6. using System.Threading;  
  7.   
  8. namespace _5._2_广播通信  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  15.             s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);  
  16.   
  17.             byte[] buffer = Encoding.Unicode.GetBytes("Hello World");  
  18.             IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 4567);//255.255.255.255  
  19.   
  20.             int i = 0;  
  21.             while (true)  
  22.             {  
  23.                 Console.WriteLine("正在进行广播 {0}", i++.ToString());  
  24.                 s.SendTo(buffer, iep1);  
  25.                 Thread.Sleep(5000);  
  26.             }  
  27.         }  
  28.     }  
  29. }  
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace _5._2_广播通信
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);

            byte[] buffer = Encoding.Unicode.GetBytes("Hello World");
            IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 4567);//255.255.255.255

            int i = 0;
            while (true)
            {
                Console.WriteLine("正在进行广播 {0}", i++.ToString());
                s.SendTo(buffer, iep1);
                Thread.Sleep(5000);
            }
        }
    }
}


对于UPD来说, 存在一个特定的广播地址 - 255.255.255.255, 广播数据都应该发送到这里。

  广播消息的目的IP地址是一种特殊IP地址,称为广播地址。

  广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255是 192.169.1.0 这个网络的广播地址;

  130.168.255.255 是130.168.0.0 这个网络的广播地址。

  向全部为1的IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。

  但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。

  进行广播通信, 必须打开广播选项 SO_BROADCAST

2. 客户端

[csharp] view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Net.Sockets;  
  5. using System.Net;  
  6.   
  7. namespace Client  
  8. {  
  9. class Program  
  10.  {  
  11. static void Main(string[] args)  
  12.  {  
  13.  Socket m_s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  14.   
  15.  IPEndPoint iep = new IPEndPoint(IPAddress.Any, 4567);  
  16.  EndPoint ep = (EndPoint)iep;  
  17.  m_s.Bind(iep);  
  18.   
  19. byte[] buffer = new byte[1204];  
  20. while (true)  
  21.  {  
  22. int revc = m_s.ReceiveFrom(buffer, ref ep);  
  23. if (revc > 0)  
  24.  {  
  25. string data = Encoding.Unicode.GetString(buffer, 0, revc);  
  26.  Console.WriteLine(data);  
  27.  }  
  28.  }  
  29.  }  
  30.  }  
  31. }  
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace Client
{
class Program
 {
static void Main(string[] args)
 {
 Socket m_s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

 IPEndPoint iep = new IPEndPoint(IPAddress.Any, 4567);
 EndPoint ep = (EndPoint)iep;
 m_s.Bind(iep);

byte[] buffer = new byte[1204];
while (true)
 {
int revc = m_s.ReceiveFrom(buffer, ref ep);
if (revc > 0)
 {
string data = Encoding.Unicode.GetString(buffer, 0, revc);
 Console.WriteLine(data);
 }
 }
 }
 }
}


3. 效果

 

 

 C#实现局域网UDP广播,这一块设置到局域网,需要用到的主要命名空间是:System.NET和System.Net.Scoket:

接收端:

           Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//初始化一个Scoket协议

            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9095);//初始化一个侦听局域网内部所有IP和指定端口

            EndPoint ep = (EndPoint)iep;

            socket.Bind(iep);//绑定这个实例

            while (true)
                   {
               byte[] buffer = new byte[1024];//设置缓冲数据流

             socket.ReceiveFrom(buffer, ref ep);//接收数据,并确把数据设置到缓冲流里面

                   Console.WriteLine(Encoding.Unicode.GetString(buffer2).TrimEnd('/u0000') + " " + DateTime.Now.ToString());
                    }

发送端:

            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//初始化一个Scoket实习,采用UDP传输

            IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9095);//初始化一个发送广播和指定端口的网络端口实例

            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);//设置该scoket实例的发送形式

            string request = "你好,TEST SEND!";//初始化需要发送而的发送数据

            byte[] buffer = Encoding.Unicode.GetBytes(request);

            sock.SendTo(buffer, iep);

            sock.Close();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#实现 UDP简单广播 的相关文章

  • 获取某一扩展名的文件集合

    获取某一扩展名的文件集合 lt summary gt lt param name 61 34 dictoryName 34 gt 目录名 lt param gt lt param name 61 34 fiterName 34 gt 扩展名
  • 使用XmlTextWriter生成XML文件的方法

    使用XmlTextWriter生成XML文件的方法 项目兼容需要生成一系列的xml文件 xff0c 总结了下XML文件的生成基本方式 项目兼容需要生成一系列的xml文件 xff0c 总结了下XML文件的生成基本方式 XmlTextWrite
  • datatable数据类型方法

    本文章已收录于 xff1a 43 Datatable数据类型介绍 简介方法介绍 用法一声明一个datatable类型用法二合并两个结构相同的datatable用法三datatable中数据的计算用法四两种遍历datatable的方法 Dat
  • C#字符串常见操作总结详解

    C 字符串常见操作总结详解 本篇文章是对C 中字符串的常见操作进行了详细的总结介绍 xff0c 需要的朋友参考下 xff08 1 xff09 取字符串长度 lt string gt Length xff08 2 xff09 字符串转为比特码
  • c#读取string类型的xml格式的字符串

    string str 61 lt resultInfo code 61 34 202 34 message 61 34 原密码输入不正确 xff01 34 gt XmlDocument xmlDoc 61 new XmlDocument x
  • C# 截取字符串

    本文章已收录于 xff1a str为要进行截取的字符串 start是第一个关键字 字符串 last是第二个关键字 字符串 public string GetContent string str string start string las
  • C#中文件及文件夾的遍历

    操作文件常用的类有 xff1a File 实用类 xff0c 提供许多静态方法 xff0c 用于移动 删除 和复制文件 Directory 实用类 xff0c 提供许多静态方法 xff0c 用于移动 删除和复制目录 Path 实用类 xff
  • C# 简单的XML读取修改写入

    XML概念 Root XML根节点 xff0c 只能且必须有一个 以上为LinkLibrary Element 节点元素 如Link Attribute 节点属性 如Cat Url Desc Content 内容 xff08 非空白文本 C
  • C# XML 添加,修改,删除Xml节点

    添加xml节点 private void AddXml string image string title XmlDocument xmlDoc 61 new XmlDocument xmlDoc Load Server MapPath 3
  • 使用Activator.CreateInstance完善简单工厂

    前几天在项目中看到别人的工厂类使用Activator CreateInstance 之前用简单工厂都是用switch case xff0c 之前没有用过便查了查资料 xff0c 正是这个方法 43 反射简化了工厂模式 xff0c 在需求增加
  • can协议的数据帧格式

    1 帧起始和帧结束 2 仲裁段 xff1a 3 控制段 xff1a 4 数据段 5 CRC段 6 ACK段
  • C#各种配置文件使用,操作方法总结

    配置文件操作 配置文件一般分为内置配置文和用户自定义配置文件 内置配置文件包括app config web config Settings settings等等 用户自定义配置文件一般是将配置信息放到XML文件或注册表中 xff0c 配置信
  • C#中配置文件的使用

    1 向项目添加app config文件 xff1a 右击项目名称 xff0c 选择 添加 添加新建项 xff0c 在出现的 添加新项 对话框中 xff0c 选择 添加应用程序配置文件 xff1b 如果项目以前没有配置文件 xff0c 则默认
  • C# 获取主机IP地址

    public static string GetIP string strAddr 61 34 34 try string strHostName 61 System Net Dns GetHostName System Net IPHos
  • C#中的继承与多态还有接口

    简单继承多态接口参考 简单继承 最简单的三个类 csharp view plain copy print public class Animal public Animal Debug Log 34 Construct Animal 34
  • C#操作配置文件中appSettings,connectionStrings节点

    using System using System Configuration using System Web using System Web Configuration namespace myConfiguration region
  • C# 配置文件读取与修改

    目录 43 旧方法 各位看官最好使用下面新方法新方法 配置文件在很多情况下都使用到 配置文件分为两种 一种是应用程序的配置文件 一种是web的配置文件 两种配置文件最大的区别是web的配置文件更新之后会实时更新 应用程序的配置文件不会实时更
  • AppSettings和ConnectionStrings的区别

    ConfigurationSettings AppSettings 34 34 和 ConfigurationManager ConnectionStrings 34 34 ConnectionStrings有什么区别 xff1f 晕呀 更
  • appsetting 和connectionString 的区别。

    AppSettings是ASP NET1 1时期用的 在 NET Framework 2 0中 xff0c 新增了ConnectionStrings 1 lt connectionStrings gt lt connectionString
  • 配置文件的方式总结

    1 xml文件存储配置信息 xff0c 属性中可设置输出到应用程序输出路径拷贝 xff0c 程序中读写使用 xff0c 程序修改只需修改xml文件然后覆盖到输出路径中 2 AppConfig文件存储 xff0c 可设置属性输出路径 xff0

随机推荐

  • 计算机大端模式和小端模式 内存对齐问题(sizeof)

    目录 43 一大端模式和小端模式的起源二什么是大端和小端三数组在大端小端情况下的存储四为什么会有大小端模式之分呢五如何判断机器的字节序内存对齐问题 再讲讲pragma pack 内存对齐二 一 大端模式和小端模式的起源 关于大端小端名词的由
  • linux虚拟机关机、重启命令

    一 shutdown 1 shutdown h now xff1a 立即关机 2 shutdown h 10 53 xff1a 到10 53关机 3 shutdown h 43 10 xff1a 10分钟后自动关机 4 shutdown r
  • C#函数的重载

    函数名必须相同方能构成函数重载 函数返回值类型 可以相同 也可以不同 注意 函数的返回类型不足以区分两个重载函数 函数参数类型 必须不同 函数参数个数 可以相同 可以不同 函数参数顺序 可以相同 可以不同 csharp view plain
  • 静态方法和实例化方法的本质区别

    本文章已收录于 xff1a 这是一个经常被时时提出来的问题 xff0c 很多时候我们以为理解了 懂了 xff0c 但深究一下 xff0c 我们却发现并不懂 方法是我们每天都在写得 xff0c 很多程序员大多都使用实例化方法 xff0c 而很
  • string,StringBuffer与StringBuilder的区别

    String 字符串常量 StringBuffer 字符串变量 xff08 线程安全 xff09 StringBuilder 字符串变量 xff08 非线程安全 xff09 简要的说 xff0c String 类型和 StringBuffe
  • C# xml文件的创建,修改和添加节点 。

    最近在做一个项目 xff0c 设计到xml文件的传输 xff0c 所以就研究了一下 xff0c NET Framework完全支持XML DOM模式 xff0c 但它不支持SAX模式 NET Framework支持两种不同的分析模式 xff
  • C#自定义ConfigSections节点操作

    sectiongroup 在config文件中加入以下节点 html view plain copy print lt configSections gt lt sectionGroup name 61 34 WebSiteInfo 34
  • 配置文件configSections节点使用实例      。

    configSections为自定义节点 xff0c 增加应用程序可移植性 xff0c 用于配置文件上传路径 xff0c 再深入应用可定义工厂方法需要加载创建的类 1 配置configSections节点 html view plain c
  • C#自定义ConfigSections节 操作 。

    sectiongroup 在config文件中加入以下节点 html view plain copy print lt configSections gt lt sectionGroup name 61 34 WebSiteInfo 34
  • C# 中的回车换行符 表示

    在 C 中 xff0c 我们用字符串 34 r n 34 表示回车换行符 string str 61 34 第一行 r n第二行 34 但是我们更推荐 Environment NewLine xff08 名称空间为 System xff09
  • C# Regex类详解

    using System using System Text RegularExpressions namespace MetarCommonSupport lt summary gt 通过Framwork类库中的Regex类实现了一些特殊
  • C#String.Split (string[], StringSplitOptions) 多参数分割得到数组

    public string Split string separator StringSplitOptions options 参数 separator 类型 xff1a System String 分隔此字符串中的子字符串的字符串数组 不
  • vim选中字符复制/剪切/粘贴

    问题描述 xff1a https www cnblogs com luosongchao p 3193153 html vim 中选中指定字符 xff0c 进行复制 剪切 粘贴 问题解决 xff1a 进入vim中visual模式 xff0c
  • for循环本质

    菜鸟 xff1a 为什么在for循环里重复定义变量不会报错 xff1f 如下代码1 xff0c 因为重复定义了两个变量 a xff0c 编译器报错 void main int a int a return 如下代码2 xff0c 用for循
  • 常见功能类库及功能

    BitConverter 数据转换类 Array 数组类 ComboBox 列表文本框
  • 基础概念笔记

    1 声明和定义的区别 声明 xff1a 是解释内存是什么类型 定义 xff1a 是赋值
  • C#中DataGridView控件使用大全

    c datagridview 分类 xff1a C C xff0b xff0b C DataGridView 动态添加新行 xff1a DataGridView控件在实际应用中非常实用 xff0c 特别需要表格显示数据时 可以静态绑定数据源
  • DataTable转成字符串复制到txt文本的小例子

    自己写了个DataTable转成字符串的方法 复制代码代码如下 public static string DataTableToString DataTable dt string dtstring 61 34 34 for int i 6
  • C#实现字符串按多个字符采用Split方法分割得到数组

    String字符串如何按多个字符采用Split方法进行分割呢 xff1f 本文提供VS2005和VS2003的实现方法 xff0c VS2005可以用下面的方法 xff1a string agentInfo 61 userInfo Attr
  • C#实现 UDP简单广播

    csharp view plain copy print 代码 Code highlighting produced by Actipro CodeHighlighter freeware http www CodeHighlighter