C#广播程序

转载 2013年12月05日 20:55:52

C#广播程序

http://www.cnblogs.com/tuyile006/archive/2006/09/14/504477.html

前言

在网络编程中,通过广播和多播可以实现发送端发送一个数据包,有多个接收端接收的情况。

 

广播

由于Tcp是有连接的,所以不能用来发送广播消息。发送广播消息,必须用到UdpUdp可以不用建立连接而发送消息。广播消息的目的IP地址是一种特殊IP地址,称为广播地址。广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255192.169.1.0这个网络的广播地址;130.168.255.255130.168.0.0这个网络的广播地址。向全部为1IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。

 

C#中发送广播消息的过程如下,注意要调用SetSockOption函数,不然要抛出异常:

   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.1.255"), 9050);
   string hostname = Dns.GetHostName();
   byte[] data = Encoding.ASCII.GetBytes(hostname);
   sock.SetSocketOption(SocketOptionLevel.Socket,
              SocketOptionName.Broadcast, 1);
   sock.SendTo(data, iep1);
   sock.SendTo(data, iep2);
   sock.Close();

C#中接收广播消息的过程如下,没有什么特别的:

   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());
   data = new byte[1024];
   recv = sock.ReceiveFrom(data, ref ep);
   stringData = Encoding.ASCII.GetString(data, 0, recv);
   Console.WriteLine("received: {0} from: {1}",
              stringData, ep.ToString());
   sock.Close();
Attentions:
1 广播可以由客户程序来通知子网内的服务程序,自己的位置。

2 发送广播消息时指定的端口也是有作用的,接收端的Udp Socket如果Bind到此接口的话,就能够接收到消息。(如果不Bind的话,就能接收所有端口的消息??)

3 接收端接到的包中显示的远端IP地址是发送端的地址。就是说广播地址不会显示到一个包的源IP地址位置(LoopBack地址不会显示到包的目的IP地址位置)

4 可以用线程不停地发送和接收广播消息,确认两端的位置和证明自己的存在

相关文章推荐

SenchaArchitect-2.0.0.000442

  • 2012年08月21日 09:07
  • 28.81MB
  • 下载

Linux命令行学习笔记

Linux学习笔记 命令行学习笔记(一) 进入中文虚拟终端: zhcon --utf8 常用命令: ls 显示 ls -a 显示全部 ls -al ...
  • charlv
  • charlv
  • 2011年09月20日 17:34
  • 500

定时提醒器-免费软件网

  • 2013年09月03日 19:50
  • 6.52MB
  • 下载

CParallelPort

  • 2011年11月22日 22:44
  • 1.58MB
  • 下载

OpenGL学习四——帧缓存

1、缓存介绍    以统一的方式对每个像素的数据进行存储的空间被称为缓存,OpenGL中有四种缓存——颜色缓存、深度缓存、模板缓存以及累积缓存。    颜色缓存存储了颜色索引或RGB颜色数据,...

Google C++ 风格指南 - 中文版

  • 2013年10月23日 21:40
  • 192KB
  • 下载

nginx负载均衡和lvs负载均衡的比较分析

lvs和nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用。 首先提醒,做技术切不可人云亦云,我云即你云;同时也不可太趋向保守,过于相信旧有方式而等别人...
  • gzh0222
  • gzh0222
  • 2011年08月11日 09:01
  • 918

Google C++ 风格指南 - 中文版

  • 2010年10月18日 10:12
  • 687KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#广播程序
举报原因:
原因补充:

(最多只允许输入30个字)