资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1UDP协议开发 1 UDP协议概述 2 UDP协议的套接字编程技术 3 使用UdpClient简化UDP编程 4 使用UDP协议进行广播和组播 21 UDP协议概述 UDP协议的特点 UDP是一个简单的、面向数据报的无连接协议,提供 了快速但不一定可靠的传输服务。 UDP与TCP的比较 优点 无连接(速度快)、可用于广播(组播)、通信量 小、有消息边界 缺点 不可靠、安全性差、不保证报文顺序交付3 SendTo()方法和ReceiveFrom()方法 UDP无需建立连接,可在任何时候直接向网络中的任意主机发送 UDP数据包。当然须指明目标地址,可以直接用SendTo()方法完 成这个功能。将创建的套接字与本地IPEndPoint进行绑定后,也 可以用ReceiveFrom()方法接收远程主机发来的数据。 使用这种方法,发送和接收UDP数据包的一般步骤为: 1) 创建一个Socket对象。2) 如果要接收UDP数据包,需要将创建的套接字与本地 IPEndPoint进行绑定。如果仅仅为了发送,则不需要绑定。3) 使用SendTo()方法和ReceiveFrom()方法发送和接收数据包 。2 UDP协议的套接字编程技术4 Send()方法和Receive()方法 为了和某一个远程主机通信,也可以在创建套接字后 ,使用Connect()方法先和远程主机建立连接,然后直 接用Send()方法和Receive()方法发送和接收数据 。 由于使用的是UDP数据包套接字,在通信中并没有实 际的链路,但是Connect()方法将套接字信息设置到 IPEndPoint对象后,Send()方法和Receive()方法就可 以自动使用IPEndPoint对象的信息 。5解决UDP数据丢失问题UDP不保证数据被真正传送到目的地。 解决方法 要求远程主机返回一个应答信息,表明已经接收到发送 的数据,如果在规定时间内没有收到返回的应答信息, 就认为该数据包已经丢失,然后重新发送刚才发送的数 据包。 实现步骤为 1) 向远程主机发送一条消息。 2) 等待远程主机回送应答信息。 3) 如果收到应答信息,则退出本循环,继续发送下 一条消息。如果在规定时间内没有收到应答信息, 则重新发送。 4) 检查重复发送次数,如果达到规定的重复次数, 则终止发送,并显示相关错误信息。6程序实例一使用SendTo()和ReceiveFrom() public static void Main() int length;byte bytes=new byte1024; Socket socket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); IPEndPoint myHost=new IPEndPoint(IPAddress.Any,6789); socket.Bind(myHost); IPEndPoint remote=newIPEndPoint(IPAddress.Parse(“127.0.0.1“),6789); EndPoint remoteHost=(EndPoint)remote; Console.Write(“输入发送的信息:“); string str=Console.ReadLine(); bytes=System.Text.Encoding.Unicode.GetBytes(str);7socket.SendTo(bytes,bytes.Length,SocketFlags.None,remoteHost); while(true)Console.WriteLine(“等待接收.“); length=socket.ReceiveFrom(bytes,ref remoteHost); str=System.Text.Encoding.Unicode.GetString(bytes,0,length);Console. WriteLine(“接收到信息:0“,str); if(str=“bye“) break; Console.Write(“输入回送信息(bye退出):“); str=Console.ReadLine(); bytes=System.Text.Encoding.Unicode.GetBytes(str); socket.SendTo(bytes,remoteHost); socket.Close();Console.WriteLine(“对方已经byebye了,请按回车键 结束。“); Console.ReadLine();8程序实例二使用Send()和Receive() public static void Main() int length;byte bytes=new byte1024; Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType. Udp); IPEndPoint myHost=new IPEndPoint(IPAddress.Any,6789); socket.Bind(myHost); IPEndPoint remote=newIPEndPoint(IPAddress.Parse(“127.0.0.1“),6789); socket.Connect(remote); Console.Write(“输入发送的信息:“); string str=Console.ReadLine(); bytes=System.Text.Encoding.Unicode.GetBytes(str); 9socket.Send(bytes); while(true) Console.WriteLine(“等待接收.“); length=socket.Receive(bytes); str=System.Text.Encoding.Unicode.GetString(bytes,0,length); Console.WriteLine(“接收到信息:0“,str); if(str=“bye“) break; Console.Write(“输入回送信息(bye退出):“); str=Console.ReadLine(); bytes=System.Text.Encoding.Unicode.GetBytes(str); socket.Send(bytes); socket.Close(); Console.WriteLine(“对方已经byebye了,请按回车键结束。“); Console.ReadLine();10程序实例三解决UDP协议数据丢失问题 public static void Main() bool exit=false;int length;byte bytes=new byte1024; Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName. ReceiveTimeout,2000); IPEndPoint myHost=new IPEndPoint(IPAddress.Any,6789); socket.Bind(myHost); IPEndPoint iep=new IPEndPoint(IPAddress.Parse(“127.0.0.1“),6789); EndPoint remote=(EndPoint)iep; while(true)int retry=0;11while(true)try Console.Write(“输入发送的信息(bye退出):“); string str=Console.ReadLine(); if(str=“bye“)exit=true;break; bytes=System.Text.Encoding.Unicode.GetBytes(str); socket.SendTo(bytes,remote); socket.ReceiveFrom(bytes,ref remote); str=System.Text.Encoding.Unicode.GetString(bytes); Console.WriteLine(“接收到信息:0“,str); catchif(retry3)retry+;continue;elseConsole.WriteLine(“发送失败!“);break; if(exit) break; socket.Close();Console.WriteLine(“请按回车键结束。“); Console.ReadLine();123 使用UdpClient简化UDP编程 UdpClient的构造函数 UdpClient() UdpClient(int port) UdpClient(IPEndPoint iep) UdpClient(string remoteHost,int port) UdpClient的常用方法和属性 Send()发送数据报 Receive()接收数据报 JoinMulticastGroup() 添加多地址发送,用于连接一个多 播组 DropMulticastGroup() 除去多地址发送,用于断开 UdpClient与一个多播组的连接 Close()关闭13使用UdpClient发送数据 发送数据要调用Send()方法来实现,但是在将数据 发送到远程主机后,不接受任何形式的确认。该方 法返回数据的长度,可用于检查数据是否已被正确 发送。 Send()方法 Send(byte data, int length, IPEndPoint iep) Send(byte data, int length, string remoteHostName, int port) Send(byte data, int length) 使用UdpClient接收数据 Receive()方法用于在指定的本地接口和端口上 接收数据,并将接收到的数据作为byte数组返回 。 关闭连接 udpClient.Close();14程序实例使用UdpClient 服务器端 static void Main()StartListener();Console.ReadLine(); private static void StartListener() UdpClient server=new UdpClient(8080); IPEndPoint myhost=null; try while(true)Console.WriteLine(“等待接收.“); byte bytes=server.Receive(ref myhost); string str=Encoding.Unicode.GetString(bytes,0,bytes.Length); Console.WriteLine(“接收到信息:0“,str); if(str=“byebye“) break; Console.WriteLine(“发送应答信息:你好,我也爱你!“); bytes=Encoding.Unicode.GetBytes(“你好,我也爱你!“); server.Send(b
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号