当前位置:首页 >> 电力/水利 >>

C#实现UDP协议


本文由 ligong528 贡献 doc 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。 C#实现 UDP 协议 实现 一. 走进 UDP 协议: UDP(UserDatagramProtocol)协议就是" 用户数据报协议",它是一种无连接的协议, 无连接主要是和 TCP 协议相比较的。我们知道 当利用 TCP 协议传送

数据的时候,首先必须先建 立连接(也就是所谓的握手)才可以传输 数据。而当计算机利用 UDP 协议进行数据传输的时候, 发送方只需要知道对方的 IP 地址 和端口号就可以发送数据,而并不需要进行连接。当然如果你 非要进行连接,通过 VisualC #也是可以实现的, 但前提是要确定连接的远程主机的端口号处于 监听状态, 否则程序会出 现不必要的错误,但这是种画蛇添足的做法,不仅丢失了 UDP 协议的 无连接传送数据的特 点和优点, 而且还给程序运行带来了不安定的因素。 所以这种方法并不值得 提倡。 由于 UDP 协议并不需要进行确定的连接,所以编写基于 UDP 协议的应用程序比起编写基 于 TCP 协议的应用程序要简单些(程序中可以不需要考虑连接和一些异常的捕获工作) 。但同 时也 给基于 UDP 协议编写的程序带来了一个致命的缺点, UDP 由于不提供可靠数据的传输, 当 计算机之间利用 UDP 协议传送数据的时候, 发送方只管发送数据, 而并不确认数据是否被对 方 接收。这样就会导致某些 UDP 协议数据包在传送的过程中丢失,尤其网络质量不令人满 意的情 况下, 丢失数据包的现象会更严重。 这就是为什么在网络上传输重要数据不采用 UDP 协议的原 因。 但是我们也不能因为这一个缺点就全面否定 UDP 协议,这是因为虽然利用 UDP 协议来传 送安全性要求高的数据是不适合的, 但对于那些不重要的数据, 或者即使丢 失若干数据包也不影 响整体性的数据,如音频数据,视频数据等,采用 UDP 协议就是一个 非常不错的选择。如目前 网络流行的很多即时聊天程序,如 OICQ 和 ICQ 等,采用的就是 UDP 协议。同时虽然 UDP 协 议无法保证数据可靠性,但具有对网络资源开销较小,数据处 理速度快的优点,所以在有些对数 据安全性要求不是很高的情况下,采用 UDP 协议也是一 个非常不错的选择。 总结一下上面的内容,可见 UDP 是一种不面向连接的网络协议,既有 其优点,也有其不足, 具体如下: 1.基于 UDP 协议的网络应用程序,实现起来比较简单, 并且基于 UDP 协议的网络应用程序在 运行时,由于受到环境影响较小,所以不容易出错。 2.UDP 协议占用网络资源较少,数据处理较快,所以在网络中传送对安全性要求不是十分高 数 据时,其优点比较明显。所谓对安全性要求不高的数据,是指那些不重要的数据,或者是 即使丢 失若干数据,也不影响其整体的数据,如音频数据等。目前很多流行的网络应用程序 都是基于 UDP 协议的,如 OICQ、ICQ 等。 3.由于其不是面向连接的网络协议,其缺点也是 非常明显的,有些时候甚至是致命的。因为使用 UDP 协议来传送数据,在数据发送后,在发 送方并不确认对方是否接收到。 这样就可能导致传 送的数据在网络中丢失, 尤其在网络条件 并不很好的情况下,丢失数据包的现象就更多。所以传 送重要数据一般不采用 UDP 协议。 二. 简介 VisualC#发送、 接收 UDP 数据包使用的主要类及其用法: 用 VisualC#实现 UDP 协 议 , 最 为 常 用 , 也 是 最 为 关 键 的 类 就 是 UdpClient , UdpClient 位 于 命 名 空 间 System.Net.Sockets 中, VisualC#发送、 接收 UDP 数据包都是通过 UdpClient 类的。 表 01 和表 02 是 UdpClient 类中常用方法和属性及其简要说明。 方法 Close Connect 说 明 关闭 UDP 连接 建立与远程主机的连接 DropMulticastGroup 退出多路广播组 JoinMulticastGroup 将 UdpClient 添加到多路 广播组 Receive Send 返回已由远程主机发送的 UDP 数据文报 将 UDP 数据文报发送到远 程主机 表 01:UdpClient 类中常用方法及其说明。 属性 说明 Active 获取或设置一个值, 该值指示是否已建立了与远程主机的连接 Client 获取或设

置 基 础 网 络 套 接 字 表 02 : UdpClient 类 中 常 用 方 法 及 其 说 明 。 1.Visual C # 使 用 UdpClient 类发送 UDP 数据包: 在具体使用中,一般分成二种情况: (1). 知道远程计 算机 IP 地址: "Send"方法的调用语法如下: public int Send ( byte[] dgram , int bytes , IPEndPoint endPoint ) ; 参数说明: dgram 要发送的 UDP 数据文报(以字节数组表示) bytes 数据文报中的 。 字节数。endPoint 一个 IPEndPoint, 它表示要将数据文报发送到的主机和端口。返回值 已 发送的字节数。 下面使用 UdpClient 发送 UDP 数据包的具体的调用例子: IPAddress HostIP = new IPAddress.Parse ( "远程计 算机 IP 地址" ) ; IPEndPoint host = new IPEndPoint ( HostIP , 8080 ) ; UdpClient.Send ( "发送的字节" , "发送 的 字节长度" , host ) ; (2) 知道远程计算机名称:: 知道远程计算机名称后, . 利用"Send"方法直接把 UDP 数 据包发送到远程主机的指定端口号上 了,这种调用方式也是最容易的,语法如下: public int Send ( byte[ ] dgram , int bytes , string hostname , int port ) ; 参数说明: dgram 要发送的 UDP 数据文报(以字节数组表示) bytes 数据文报中的 。 字节数。 hostname 要连接到的远程主机的名称。 port 要与其通讯的远程端口号。 返回值 已发送的字节数。 2.Visual C#使用 UdpClient 类接收 UDP 数据包: 接收 UDP 数据包使 用的是 UdpClient 中的"Receive"方法。此方法的调用语法如下: public byte [] Receive ( ref IPEndPoint remoteEP ) ; 参数 remoteEP 是一个 IPEndPoint 类的实例, 它表示网络中发送此数据包的节点。 如 果指定了远程计算机要发送到本地机的端口号,也可以通过侦听本地端口号来实现对数据的 获 取,下面就是通过侦听本地端口号"8080"来获取信息代码: server = new UdpClient ( ) ; receivePoint = new IPEndPoint (new IPAddress ( "127.0.0.1" ) , 8080 ) ; byte[] recData = server.Receive ( ref receivePoint ) ; 协议之网络对时系统的体系结构及功能简介: 三.Visual C#实现 UDP 协议之网络对 时系统的体系结构及功能简介: # 在局域网中有很多应用软件为了协同工作,需要保证客 户机上时间统一, 而为了实现这一点, 常的做法是客户机从一个时间相对正确的服务器读 通 取时间, 以此来校正本地时间。 如经常看到的 GPS 对时系统等。本节编写的局域网上对时 系统的主要的功能是保证局域网上计算机时间、 期的统一。 日 网络对时程序是体系结构分成 服务器端程序和客户端程序二个部分,具体的作法是: 在同一个网段上, 固定一台计算机 作为对时的服务器, 在这个网段的所有计算机都可以读取这台 服务器上的时间和日期,并 依此服务器上的时间和日期为基准, 来确定本地的时间和日期。 在服 务器端程序需要达到以 下功能: 能够接收局域网中任一台客户机的请求 记录请求客户机的计算机名称,和请求时 间 准确发送服务器端的时间和日期 端程序要达到以下功能: 能够设定服务器的主机或者 IP 地址 能够接收服务器端发送的时间、 日期信息 能够以接收的服务器端时间、 日期为基准, 校正本地时间 因此在具体用 Visual C#实现网络对时系统时就包括二个部分:服务器端程 序和客户端程序。 下面首先介绍 Visual C#实现网络对时系统中服务器端程序的具体步骤。 四. Visual C #实现网络对时系统之服务器端程序的具体步骤:#实现网络对时系统之服务器端程序的具 体步骤: 服务器端程序比客户端程序相对要简单,主要因是服务器端程序的工作比较简单, 就 是接收客户端的对时请求、 发送服务器端的时间数据。 而于客户端不仅要传送和接收数据, 还要 把服务器端的时间提取出来, 并以此来修改本地计算机的时间、 日期。 下面是用 Visual C#实 现网络对时系统之服务器端程序的具体步骤步骤。 1.启动 Visual Studio .Net。 2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。 3.将【项目类型】设

置为【Visual C#项目】 4.将【模板】设置为【Windows 应用程序】 5.在【名称】文本 。 。 框中输入【UDP 对时服务器端】 6.在【位置】的文本框中输入【E:\VS.NET 项目】 。 ,然后单 击【确定】按钮 7.在【解决方案资源管理器】窗口中,双击 Form1.cs 文件,进入 Form1.cs 文件的编辑界面。 8.在 Form1.cs 文件的开头, 用下列导入命名空间代码替代系统缺省的导 入命名空间代码。 using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; using System.Net ; using System.Net.Sockets ; using System.Threading ; //程序中使用到线 程 using System.Text ; //程序中使用到编码 9.切换到【Form1.cs(设计) 】窗口,并从【工具箱】中的【Windows 窗体组件】中往窗 体 中拖入下列组件, 并执行相应操作: 一个 Label 组件, 显示对时服务器正在运行信息 一 个 ListBox 组件,名称为 listBox1,用以显示客户端和服务器端交流的日志 一个 Button 组件,名称为 button1,并在其拖入窗体后,双击,则系统会在 Form1.cs 文件 中产生其 Click 事件对应的处理代码。 10.在 【解决方案资源管理器】 窗口中, 双击 Form1.cs 文 件, 进入 Form1.cs 文件的编辑界面。 在 Form1.cs 中的 class 代码区添加下列代码,下 列代码是定义程序中使用的全局变量和创建 全局使用的实例: private UdpClient server ; private IPEndPoint receivePoint ; private int port = 8080 ; //定义端口号 private int ip = 127001 ; //设定本地 IP 地址 private Thread startServer ; 11.以下面代码替代系统产生的 InitializeComponent 过程。 private void InitializeComponent ( ) { this.listBox1 = new System.Windows.Forms.ListBox ( ) ; this.label1 = new System.Windows.Forms.Label ( ) ; this.button1 = new System.Windows.Forms.Button ( ) ; this.SuspendLayout ( ) ; this.listBox1.ItemHeight = 12 ; this.listBox1.Location = new System.Drawing.Point ( 14 , 40 ) ; this.listBox1.Name = "listBox1" ; this.listBox1.Size = new System.Drawing.Size ( 268 , 220 ) ; this.listBox1.TabIndex = 0 ; this.label1.ForeColor = System.Drawing.Color.Red ; this.label1.Location = new System.Drawing.Point ( 44 , 10 ) ; this.label1.Name = "label1" ; this.label1.Size = new System.Drawing.Size ( 210 , 24 ) ; this.label1.TabIndex = 1 ; this.label1.Text = "UDP 对 时 服 务 器 端 正 在 运 行 ......" ; this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ; this.button1.Location = new System.Drawing.Point ( 106 , 278 ) ; his.button1.Name = "button1" ; this.button1.Size = new System.Drawing.Size ( 75 , 34 ) ; this.button1.TabIndex = 2 ; this.button1.Text = "清除信息" ; this.button1.Click += new System.EventHandler ( this.button1_Click ) ; this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ; this.ClientSize = new System.Drawing.Size ( 300 , 329 ) ; this.Controls.AddRange ( new System.Windows.Forms.Control[] { this.button1 , this.listBox1 , this.label1} ) ; this.MaximizeBox = false ; this.Name = "Form1" ; this.Text = "UDP 对时服务器端" ; this.Load += new System.EventHandler ( this.Form1_Load ) ; this.ResumeLayout ( false ) ; } 至此, 【UDP 对时服务器端】项目的界面设计和功能实现的前期工作就完成了,设计界面 如图 01 所示: : 【UDP 对时服务器端】 项目的设计界面 对时服务器端】 图 01: : 12.在 Form1.cs 【 【 文 件 中 的 InitializeComponent 过 程 的 后 面 添 加 下 面 代 码 , 下 列 代 码 是 定 义 过 程

"start_server"。 此过程的功能是获取客户端对时请求数据, 并向客户端发送服务器当前 时 间和日期。 public void start_server ( ) { while ( true ) { //接收从远程主机发送到本地 8080 端口的 数据 byte[] recData = server.Receive ( ref receivePoint ) ; ASCIIEncoding encode = new ASCIIEncoding ( ) ; //获得客户 端请求数据 string Read_str = encode.GetString ( recData ) ; //提取客户端的信息, 存放到定义为 temp 的字符串数组中 string[] temp = Read_str.Split ( "/".ToCharArray ( ) ) ; // 显 示 端 口 号 的 请 求 信 息 listBox1.Items.Add ( " 时 间 : "+ DateTime.Now. ToLongTimeString ( ) + " 接收信息如 下:" ) ; listBox1.Items.Add ( "客户机:" + temp[0] ) ; listBox1.Items.Add ( "端口号:" + temp[1] ) ; //发送服务器端时间和日 期 byte[] sendData =encode.GetBytes ( System.DateTime.Now.ToString ( ) ) ; listBox1.Items.Add ( "发送服务器时间! " ) ; //对远程主机的指定端口号发送服务器时 间 server.Send ( sendData , sendData.Length , temp[0] , Int32.Parse ( temp[1] ) ) ; } } 请注意:上述代码中约定客户机程序发送对时请求信息到服务器的 8080 端口号。服务 器端程 序接收发送到本地 8080 端口号的数据就完成了数据接收。 为了能够让服务器端程序 知道是那 台客户机提出请求和要把对时信息发送到客户机的那个端口号上, 客户端程序对 发送的对时请求 信息进行了设计。客户端的对时请求信息结构为: 计算机名称 + / + 客户 机接收信息端口号 这样如果客户端计算机名称为:majinhu,接收服务器端时间数据的端口 号是 8080,则客户端 程序发送的对时请求数据就为:majinhu/8080。 服务器端程序在接收 到客户端对时请求数据, 并进行分析后, 就能够通过 UdpClient 类的 Send 方法准确的把 服务器端当前的时间和日期发送到客户端指定的端口号上。 这样客户端程序通过读 取指定 的端口号, 就能够获得服务器端当前的时间和日期, 从而以此来修正客户端的时间和日期 了。 13.在"start_server"过程之后面添加下面代码, 下列代码是定义"run"过程。 "run" 过程的作用 是创建一个线程实例, 并以"start_server"过程来初始化线程实例。 之所以采用 线程是因为服 务器端程序需要不间断读取发送到 8080 端口号,并且 Receive 方法是一个 阻塞式方法。采用 线程就是为了保证服务器端程序正常运行: public void run ( ) { //利用本地 8080 端口号来初始化一个 UDP 网络服务 server = new UdpClient ( port ) ; receivePoint = new IPEndPoint ( new IPAddress ( ip ) , port ) ; //开一个线程 startServer = new Thread ( new ThreadStart ( start_server ) ) ; // 启动线程 startServer.Start ( ) ; } 14.在 Form1.cs 中的 Main 函数之后添加下列代码,下列代码是定义"Form1_Load"事 件,在 此事件中将调用"run"过程,这样当服务器端程序运行后,就启动网络对时服务: private void Form1_Load ( object sender , System.EventArgs e ) { //启动对时服 务 run ( ) ; } 15.在 Form1.cs 文件中的"Form1_Load"事件之后, 添加下列代码, 下列代码是定义 button1 的"Click"事件,此事件的作用是清除服务器端程序显示的日志信息: private void button1_Click ( object sender , System.EventArgs e ) { //清除服 务器端程序日志 listBox1.Items.Clear ( ) ; } 16.用下列代码替换 Form1.cs 中的 Dispose 方法。下列代码的功能是手动收集程序中 使用的 资源: protected override void Dispose ( disposing ) { bool try { //关闭线程 startServer.Abort ( ) ; //清除资源 server.Close ( ) ; } catch { } ; if ( disposing ) { if ( components != null ) { components.Dispose ( ) ; } }

base.Dispose ( disposing ) ; } 至此,在上述步骤都正确完成, 【UDP 对时服务器端】项目的全部工作就完成了。图 02 【UDP 对时服务器端】运行后的界面,在日志信息中记录了对时请求客户机的名称,发送对 时数据的端 口号以及客户端请求的时间: : 【UDP 对时服务器端】 项目的运行界面 对时服务器 服务器端 项目的运行界面 图 02: 【 : c# 得到局域网中可用 SqlServer 服务器列表(转) 服务器列表 转 【 static void Main(string[] args) { // Retrieve the enumerator instance and then the data. SqlDataSourceEnumerator instance =SqlDataSourceEnumerator.Instance; System.Data.DataTable table = instance.GetDataSources(); // Display the contents of the table. DisplayData(table); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } private static void DisplayData(System.Data.DataTable table) { foreach (System.Data.DataRow row in table.Rows) { foreach (System.Data.DataColumn col in table.Columns) { Console.WriteLine("{0} = {1}", col.ColumnName, row[col]); } Console.WriteLine("==="); } }


相关文章:
常用协议协议
以多种速率采 用 CSMA/CD 访问方式,对于快速以太网该标准说明的实现方法有所...协议和 UDP 协议的区别 1,TCP 协议面向连接,UDP 协议面向非连接 2,TCP 协议...
C#的Socket实现UDP协议通信
C#的Socket实现UDP协议通信_计算机软件及应用_IT/计算机_专业资料。C#的Socket实现UDP协议通信今天稍花化了一点时间,利用 C#的 Socket 验证了 UDP 的通信,为接下来...
UDP协议设计与实现
五、 UDP 协议实现 发送方:transport_udp_send.cpp (.h) 定义一个 UDP 协议数据单元数据结构 定义变量: Struct source_address { Source_ip; Source_port; }...
C#实现UDP协议
C#实现 UDP 协议 实现 一. 走进 UDP 协议: UDP(UserDatagramProtocol)协议就是" 用户数据报协议",它是一种无连接的协议, 无连接主要是和 TCP 协议相比较的。...
UDP协议及分析
UDP 和 TCP 协议正是采用这一机制实现对同一时刻内多项应用同时发 送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将 UDP 数据包通过源端口发送出去...
TCP和UDP数据包发送程序的设计和实现(C#)
TCP和UDP数据包发送程序的设计和实现(C#)_计算机软件及应用_IT/计算机_专业资料。在TCP/IP协议族中,传输层主要包括TCP和UDP两种通信协议,它们以不同的方式实现两...
基于UDP协议的聊天程序设计报告
基于UDP传输协议的实时通... 17页 免费 udp聊天程序C#开发UDP协... 暂无评价...选择合适的开发环境,参考已有的群聊程序功能,设计模拟实现基 于 UDP 的群聊...
常用协议及端口号
UDP 协议支持协议名称 UDP 端口号 协议名称解释 3com Network Jack 3GA11 699 5264:Packets to Managementstation 5265:Packets to Switch Port used for Mobile ...
TCP及UDP协议学习
TCP及UDP协议学习_学习总结_总结/汇报_实用文档。TCP:传输控制协议。面向连接、可靠 ①通过滑动窗口机制防止拥塞 ②通过序列号防止乱序 ③通过 ACK 防止丢包 ④通过...
全面掌握VisualC#实现UDP协议
全面掌握VisualC#实现UDP协议全面掌握VisualC#实现UDP协议隐藏>> 全面掌握 VisualC#实现 UDP 协议 #协议: 一.走进 UDP 协议: UDP(User Datagram Protocol)协议就是...
更多相关标签:
c实现udp通信 | c udp 实现 | c udp协议 | c实现udp多线程例子 | c udp通讯协议流程 | mqtt协议c语言实现 | c实现http协议 | c语言实现http协议 |