zoukankan      html  css  js  c++  java
  • 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地址等信息,等待客户端接收

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Net;
     6 using System.Net.Sockets;
     7 using System.Threading;
     8 using System.Threading.Tasks;
     9 
    10 namespace scoket_udp_服务器
    11 {
    12     class Program
    13     {
    14         private static Socket sock;
    15         private static IPEndPoint iep1;
    16         private static byte[] data;
    17         static void Main(string[] args)
    18         {
    19             sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
    20             ProtocolType.Udp);
    21             //255.255.255.255
    22             iep1 =
    23             new IPEndPoint(IPAddress.Broadcast, 9050);
    24 
    25             string hostname = Dns.GetHostName();
    26             data = Encoding.ASCII.GetBytes(hostname);
    27 
    28             sock.SetSocketOption(SocketOptionLevel.Socket,
    29             SocketOptionName.Broadcast, 1);
    30 
    31             Thread t = new Thread(BroadcastMessage);
    32             t.Start();
    33             //sock.Close();
    34 
    35             Console.ReadKey();
    36 
    37         }
    38 
    39         private static void BroadcastMessage()
    40         {
    41             while (true)
    42             {
    43                 sock.SendTo(data, iep1);
    44                 Thread.Sleep(2000);
    45             }
    46             
    47         }
    48 
    49     }
    50 }

    三、客户端

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Net;
     6 using System.Net.Sockets;
     7 using System.Threading.Tasks;
     8 
     9 namespace socket客户端udp
    10 {
    11     class Program
    12     {
    13         static void Main(string[] args)
    14         {
    15             Socket sock = new Socket(AddressFamily.InterNetwork,
    16             SocketType.Dgram, ProtocolType.Udp);
    17             IPEndPoint iep =
    18             new IPEndPoint(IPAddress.Any, 9050);
    19             sock.Bind(iep);
    20             EndPoint ep = (EndPoint)iep;
    21             Console.WriteLine("Ready to receive…");
    22 
    23             byte[] data = new byte[1024];
    24             int recv = sock.ReceiveFrom(data, ref ep);
    25             string stringData = Encoding.ASCII.GetString(data, 0, recv);
    26 
    27             Console.WriteLine("received: {0} from: {1}",
    28             stringData, ep.ToString());           
    29             sock.Close();
    30 
    31             Console.ReadKey();
    32         }
    33     }
    34 }
  • 相关阅读:
    Eclipse在线安装spring-tool-suit插件
    使用Eclipse构建Maven项目
    uwsgi+flask环境中安装matplotlib
    开启flask调试
    linux进入软连接所指向的原目录
    eclipse打不开,报错 "java was started with exit code=13"
    gnuplot 的安装
    使用tcp_probe时最初没有输出,先卸载后加载模块之后就有了。
    一个简单的socket程序运行与抓包查看
    如何查看文件是dos格式还是unix格式的?
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/4944894.html
Copyright © 2011-2022 走看看