c# socket udp广播
2015-11-07 13:20
411 查看
一、广播消息
由于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地址等信息,等待客户端接收
三、客户端
由于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(); } } }
相关文章推荐
- CSharp 调用存储过程来执行增、删、改操作
- 【C#】获取系统信息
- 【C#】文件拖放到窗体
- C#操作IIS程序池及站点的创建配置实现代码
- 5.C# 串口类处理上传传感器数据
- 初探C#
- C#正则表达式匹配任意字符
- 【C#】MouseEventArgs事件参数获取鼠标的位置
- C#影院售票系统毕业设计(4)
- C#语言 类
- WPF版的别踩白块
- C#日期与时间
- c#:类 相关练习;
- 在C#中简单调用FindWindow控制其他程序
- Direct3D 地形
- C#开发模式
- C#判断操作系统类型总结
- 微软C# Process类的两个静态方法 存在内存泄露
- C#访问剪切板
- C#总结项目《影院售票系统》编写总结完结篇