C#的UDP广播通信程序示例

来源:互联网 发布:淘宝怎样删除评价记录 编辑:程序博客网 时间:2024/05/10 05:21

        最近做的一个项目,其背景是应用在工业控制系统,软件的主要功能就是,在上位的PC机上,开发一个PLC控制器的管理软件,可以探测当前网络环境中,有多少个PLC控制器,每个控制器的IP地址是多少?

为了实现这样的一个探测的功能,很显然让我想到了采用广播通信的方式,来获取对侧PLC控制器的特定响应,从而接收相应的IP信息。具体的实现方案如下:

首先,PC侧向当前网络段,采用UDP广播通信的方式,发送探测命令报文,报文格式如下:

0x55ox010x00

PLC控制器,建立UDP报文的监听端口,一旦监测到如上述格式的报文命令,则向该报文的源端,发送确认回答信息,并将该控制器的IP信息打包发送。


在设计好实现方案后,具体的实现,就需要交给C#。由于本人以前对C#的网络编程不甚了解,所以就花了一此时间搜集相关的资料,来搜寻C#网络编程,特别是UDP通信的一些例程。C#的UDP通信,一般也分为服务器端与客户端,这里在网上找了一个例程,与大家共同学习。


服务器端:

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 ();                    }    }}





原创粉丝点击