C# socket udp广播


一、广播消息

  由于Tcp是有连接的,所以不能用来发送广播消息。发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息。广播消息的目的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)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。

  利用udp广播可以实现像cs中建立服务器后,客户端可以收到服务器消息从而进行连接。

二、服务端

开启线程不断广播自己ip地址等信息,等待客户端接收

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

namespace scoket_udp_服务器
{
    class Program
    {
        private static Socket sock;
        private static IPEndPoint iep1;
        private static byte[] data;
        static void Main(string[] args)
        {
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);
            //255.255.255.255
            iep1 =
            new IPEndPoint(IPAddress.Broadcast, 9050);

            string hostname = Dns.GetHostName();
            data = Encoding.ASCII.GetBytes(hostname);

            sock.SetSocketOption(SocketOptionLevel.Socket,
            SocketOptionName.Broadcast, 1);

            Thread t = new Thread(BroadcastMessage);
            t.Start();
            //sock.Close();

            Console.ReadKey();

        }

        private static void BroadcastMessage()
        {
            while (true)
            {
                sock.SendTo(data, iep1);
                Thread.Sleep(2000);
            }
           
        }

    }
}

三、客户端

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

namespace socket客户端udp
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep =
            new IPEndPoint(IPAddress.Any, 9050);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to receive…");

            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);

            Console.WriteLine("received: {0} from: {1}",
            stringData, ep.ToString());         
            sock.Close();

            Console.ReadKey();
        }
    }
}

本文永久更新链接地址

相关内容