C# UDP通信|C#的UDP通信|c# udp 广播

C# UDP通信
Internet协议族中有支持无连接的传输协议,即UDP协议。UDP协议提供了一种方法来发送经过封装的IP数据报,而且不必建立连接就

可以发送这些IP数据报。
服务器端:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            int recv;
            byte[] data = new byte[1024];

            //构建TCP 服务器

            //得到本机IP,设置TCP端口号        
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram , ProtocolType.Udp);

            //绑定网络地址
            newsock.Bind(ipep);

            Console.WriteLine("This is a Server, host name is {0}",Dns.GetHostName());

            //等待客户机连接
            Console.WriteLine("Waiting for a client");

            //得到客户机IP
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)(sender);
            recv = newsock.ReceiveFrom(data, ref Remote);
            Console .WriteLine ("Message received from {0}: ", Remote.ToString ());
            Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv ));

            //客户机连接成功后,发送欢迎信息
            string welcome = "Welcome ! ";

            //字符串与字节数组相互转换
            data  = Encoding .ASCII .GetBytes (welcome );

            //发送信息
            newsock .SendTo (data ,data.Length ,SocketFlags .None ,Remote );
            while (true )
            {
                data =new byte [1024];
                //发送接受信息
                recv =newsock.ReceiveFrom(data ,ref Remote);
                Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv));
                newsock .SendTo (data ,recv ,SocketFlags .None ,Remote );
            }
        }

    }
}

客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[1024];
            string input ,stringData;

            //构建TCP 服务器

            Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());

            //设置服务IP,设置TCP端口号
            IPEndPoint ipep = new IPEndPoint(IPAddress .Parse ("127.0.0.1") , 8001);

            //定义网络类型,数据连接类型和网络协议UDP
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            string welcome = "Hello! ";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ipep);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;

            data = new byte[1024];
            //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
            //server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
            int recv = server.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message received from {0}: ", Remote.ToString());
            Console.WriteLine(Encoding .ASCII .GetString (data,0,recv));
            while (true)
            {
                input = Console .ReadLine ();
                if (input =="exit")
                    break ;
                server .SendTo (Encoding .ASCII .GetBytes (input ),Remote );
                data = new byte [1024];
                recv = server.ReceiveFrom(data, ref Remote);
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);
            }
            Console .WriteLine ("Stopping Client.");
            server .Close ();           
        }

    }
}

MSDN 实例
// This constructor arbitrarily assigns the local port number.
UdpClient udpClient = new UdpClient(11000);
    try{
         udpClient.Connect("www.contoso.com ", 11000);

         // Sends a message to the host to which you have connected.
         Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
     
         udpClient.Send(sendBytes, sendBytes.Length);

         // Sends a message to a different host using optional hostname and port parameters.
         UdpClient udpClientB = new UdpClient();
         udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);

         //IPEndPoint object will allow us to read datagrams sent from any source.
         IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

         // Blocks until a message returns on this socket from a remote host.
         Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
         string returnData = Encoding.ASCII.GetString(receiveBytes);
  
         // Uses the IPEndPoint object to determine which of these two hosts responded.
         Console.WriteLine("This is the message you received " +
                                      returnData.ToString());
         Console.WriteLine("This message was sent from " +
                                     RemoteIpEndPoint.Address.ToString() +
                                     " on their port number " +
                                     RemoteIpEndPoint.Port.ToString());

          udpClient.Close();
          udpClientB.Close();
         
          } 
       catch (Exception e ) {
                  Console.WriteLine(e.ToString());
        }
 
Microsoft Visual Studio 2005/.NET Framework 2.0


同时提供下列产品的其他版本:
•.NET Framework 3.0
•Microsoft Visual Studio 2008/.NET Framework 3.5
.NET Framework 类库UdpClient 成员
提供用户数据报 (UDP) 网络服务。

下表列出了由 UdpClient 类型公开的成员。

  公共构造函数
  名称  说明 
   UdpClient  已重载。初始化 UdpClient 类的新实例。
  公共属性
(请参见 受保护的属性 )   名称  说明 
  Available  获取从网络接收的可读取的数据量。
   Client  获取或设置基础网络 Socket。
  DontFragment  获取或设置 Boolean 值,指定 UdpClient 是否允许对 Internet 协议 (IP) 数据报进行分段。
  EnableBroadcast  获取或设置 Boolean 值,指定 UdpClient 是否可以发送或接收广播数据包。
  ExclusiveAddressUse  获取或设置 Boolean 值,指定 UdpClient 是否只允许一个客户端使用端口。
  MulticastLoopback  获取或设置 Boolean 值,指定是否将输出多路广播数据包传递给发送应用程序。
  Ttl  获取或设置一个值,指定由 UdpClient 发送的 Internet 协议 (IP) 数据包的生存时间 (TTL)。
  受保护的属性
  名称  说明 
   Active  获取或设置一个值,该值指示是否已建立默认远程主机。
  公共方法
(请参见 受保护的方法 )   名称  说明 
  BeginReceive  从远程主机异步接收数据报。 
  BeginSend  已重载。 将数据报异步发送到远程主机。 
   Close  关闭 UDP 连接。 
   Connect  已重载。 建立默认远程主机。 
   DropMulticastGroup  已重载。 退出多路广播组。 
  EndReceive  结束挂起的异步接收。 
  EndSend  结束挂起的异步发送。 
   Equals   已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。)
   GetHashCode   用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。)
   GetType   获取当前实例的 Type。 (从 Object 继承。)
   JoinMulticastGroup  已重载。 将 UdpClient 添加到多路广播组。 
   Receive  返回已由远程主机发送的 UDP 数据报。 
    ReferenceEquals   确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。)
   Send  已重载。 将 UDP 数据报发送到远程主机。 
   ToString   返回表示当前 Object 的 String。 (从 Object 继承。)
  受保护的方法
  名称  说明 
  Dispose  释放由 UdpClient 占用的非托管资源,还可以另外再释放托管资源。 
   Finalize   允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
   MemberwiseClone   创建当前 Object 的浅表副本。 (从 Object 继承。)
  显式接口实现
  名称  说明 
    System.IDisposable.Dispose  释放由 UdpClient 使用的所有资源。 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值