《pudncomdownloads102doc416610C#第11章UDP协议开发p》由会员分享,可在线阅读,更多相关《pudncomdownloads102doc416610C#第11章UDP协议开发p(26页珍藏版)》请在金锄头文库上搜索。
1、1第十一章第十一章 UDP协议开发协议开发 11.1 UDP协议概述协议概述 11.2 UDP协议的套接字编程技术协议的套接字编程技术 11.3 使用使用UdpClient简化简化UDP编程编程 11.4 使用使用UDP协议进行广播和组播协议进行广播和组播 211.1 UDP协议概述协议概述 UDP协议的特点协议的特点UDP是一个简单的、面向数据报的无连接协议,提供是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。了快速但不一定可靠的传输服务。 UDP与与TCP的比较的比较 优点优点无连接(速度快)、可用于广播(组播)、通信量无连接(速度快)、可用于广播(组播)、通信量小
2、、有消息边界小、有消息边界缺点缺点不可靠、安全性差、不保证报文顺序交付不可靠、安全性差、不保证报文顺序交付3 SendTo()方法和方法和ReceiveFrom()方法方法UDP无需建立连接,可在任何时候直接向网络中的任意主机发送无需建立连接,可在任何时候直接向网络中的任意主机发送UDP数据包。当然须指明目标地址,可以直接用数据包。当然须指明目标地址,可以直接用SendTo()方法完方法完成这个功能。将创建的套接字与本地成这个功能。将创建的套接字与本地IPEndPoint进行绑定后,也进行绑定后,也可以用可以用ReceiveFrom()方法接收远程主机发来的数据。方法接收远程主机发来的数据。
3、使用这种方法,发送和接收使用这种方法,发送和接收UDP数据包的一般步骤为:数据包的一般步骤为:1) 创建一个创建一个Socket对象。对象。 2) 如如果果要要接接收收UDP数数据据包包,需需要要将将创创建建的的套套接接字字与与本本地地IPEndPoint进行绑定。如果仅仅为了发送,则不需要绑定。进行绑定。如果仅仅为了发送,则不需要绑定。 3) 使用使用SendTo()方法和方法和ReceiveFrom()方法发送和接收数据包。方法发送和接收数据包。11.2 UDP协议的套接字编程技术协议的套接字编程技术4 Send()方法和方法和Receive()方法方法 为了和某一个远程主机通信,也可以在
4、创建套接字后,为了和某一个远程主机通信,也可以在创建套接字后,使用使用Connect()方法先和远程主机建立连接,然后直接方法先和远程主机建立连接,然后直接用用Send()方法和方法和Receive()方法发送和接收数据方法发送和接收数据 。由于使用的是由于使用的是UDP数据包套接字,在通信中并没有实数据包套接字,在通信中并没有实际的链路,但是际的链路,但是Connect()方法将套接字信息设置到方法将套接字信息设置到IPEndPoint对象后,对象后,Send()方法和方法和Receive()方法就可方法就可以自动使用以自动使用IPEndPoint对象的信息对象的信息 。5解决解决UDP数据
5、丢失问题数据丢失问题UDPUDP不保证数据被真正传送到目的地。不保证数据被真正传送到目的地。 解决方法解决方法要求远程主机返回一个应答信息,表明已经接收到发送要求远程主机返回一个应答信息,表明已经接收到发送的数据,如果在规定时间内没有收到返回的应答信息,的数据,如果在规定时间内没有收到返回的应答信息,就认为该数据包已经丢失,然后重新发送刚才发送的数就认为该数据包已经丢失,然后重新发送刚才发送的数据包。据包。 实现步骤为实现步骤为1) 1) 向远程主机发送一条消息。向远程主机发送一条消息。2) 2) 等待远程主机回送应答信息。等待远程主机回送应答信息。3) 3) 如如果果收收到到应应答答信信息息
6、,则则退退出出本本循循环环,继继续续发发送送下下一一条条消消息息。如如果果在在规规定定时时间间内内没没有有收收到到应应答答信信息息,则重新发送。则重新发送。4) 4) 检检查查重重复复发发送送次次数数,如如果果达达到到规规定定的的重重复复次次数数,则终止发送,并显示相关错误信息。则终止发送,并显示相关错误信息。6程序实例一程序实例一使用使用SendTo()和和ReceiveFrom() public static void Main()int length;byte bytes=new byte1024;Socket socket=newSocket(AddressFamily.InterNe
7、twork,SocketType.Dgram,ProtocolType.Udp);IPEndPoint myHost=new IPEndPoint(IPAddress.Any,6789);socket.Bind(myHost);IPEndPoint remote=new IPEndPoint(IPAddress.Parse(127.0.0.1),6789);EndPoint remoteHost=(EndPoint)remote;Console.Write(输入发送的信息:输入发送的信息:);string str=Console.ReadLine();bytes=System.Text.Enc
8、oding.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
9、.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 b
10、ytes=new byte1024;Socket socket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); IPEndPoint myHost=new IPEndPoint(IPAddress.Any,6789); socket.Bind(myHost);IPEndPoint remote=new IPEndPoint(IPAddress.Parse(127.0.0.1),6789);socket.Connect(remote);Console.Write(输入发送的信息:输入发送的信息:);
11、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(输入回
12、送信息(输入回送信息(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 by
13、tes=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(IPAd
14、dress.Parse(127.0.0.1),6789);EndPoint remote=(EndPoint)iep;while(true) int retry=0;11while(true)tryConsole.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(byte
15、s,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();1211.3 使用使用UdpClient简化简化UDP编程编程 UdpClient的
16、构造函数的构造函数 UdpClient() UdpClient(int port) UdpClient(IPEndPoint iep) UdpClient(string remoteHost,int port) UdpClient的常用方法和属性的常用方法和属性 Send()Send()发送数据报发送数据报 Receive()Receive()接收数据报接收数据报 JoinMulticastGroupJoinMulticastGroup() () 添添加加多多地地址址发发送送,用用于于连连接接一一个个多多播组播组 DropMulticastGroupDropMulticastGroup() (
17、) 除除 去去 多多 地地 址址 发发 送送 , 用用 于于 断断 开开UdpClientUdpClient与一个多播组的连接与一个多播组的连接 Close()Close()关闭关闭13使用使用UdpClientUdpClient发送数据发送数据发送数据要调用发送数据要调用Send()Send()方法来实现,但是在将数据方法来实现,但是在将数据发送到远程主机后,不接受任何形式的确认。该方发送到远程主机后,不接受任何形式的确认。该方法返回数据的长度,可用于检查数据是否已被正确法返回数据的长度,可用于检查数据是否已被正确发送。发送。Send()Send()方法方法Send(byte data, S
18、end(byte data, intint length, length, IPEndPointIPEndPoint iepiep) ) Send(byte data, Send(byte data, intint length, string length, string remoteHostNameremoteHostName, , intint port) port) Send(byte data, Send(byte data, intint length) length) 使用使用UdpClientUdpClient接收数据接收数据Receive()Receive()方法用于在指定的
19、本地接口和端口上方法用于在指定的本地接口和端口上接收数据,并将接收到的数据作为接收数据,并将接收到的数据作为bytebyte数组返回。数组返回。 关闭连接关闭连接 udpClient.Close();14程序实例程序实例使用使用UdpClient服务器端服务器端static void Main()StartListener();Console.ReadLine();private static void StartListener()UdpClient server=new UdpClient(8080);IPEndPoint myhost=null; trywhile(true)Consol
20、e.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(bytes,byt
21、es.Length,127.0.0.1,8081);server.Close();Console.WriteLine(对方已经对方已经byebye了,请按回车键退出。了,请按回车键退出。);catch(Exception err)Console.WriteLine(err.ToString();15程序实例程序实例使用使用UdpClient客户端编程客户端编程static void Main(string args)Send(你好,朋友你好,朋友! I love you!);Send(byebye);Console.ReadLine();private static void Send(str
22、ing message)UdpClient client=new UdpClient(8081);tryConsole.WriteLine(向向8080发送数据:发送数据:0,message);byte bytes=System.Text.Encoding.Unicode.GetBytes(message);client.Send(bytes,bytes.Length,127.0.0.1,8080);if(message=byebye)Console.WriteLine(已经向对方发送已经向对方发送byebye,请按回车退出程序请按回车退出程序);return;IPEndPoint host=
23、null;byte response=client.Receive(ref host);Console.WriteLine(接收到返回信息:接收到返回信息:0),System.Text.Encoding.Unicode.GetString(response);client.Close();catch(Exceptionerr)Console.WriteLine(err.ToString();1611.4 使用使用UDP协议进行广播和组播协议进行广播和组播 基本概念基本概念广播广播组播组播地址地址广播地址广播地址组播地址组播地址17程序实例一程序实例一向子网发送广播数据包向子网发送广播数据包 创
24、建一个创建一个Windows应用程序,设计界面如图应用程序,设计界面如图 18程序实例一程序实例一向子网发送广播数据包向子网发送广播数据包【发送【发送】按钮的按钮的ClickClick事件代码事件代码private private void void button1_Click(object button1_Click(object sender, sender, System.System.EventArgsEventArgs e) e) /只能用只能用UDPUDP协议发送广播,所以协议发送广播,所以ProtocolTypeProtocolType设置为设置为UdpUdpSocket soc
25、ket=new Socket(Socket socket=new Socket(AddressFamilyAddressFamily. .InterNetworkInterNetwork, ,SocketTypeSocketType. .DgramDgram, ,ProtocolTyProtocolTypepe. .UdpUdp););19程序实例一程序实例一向子网发送广播数据包向子网发送广播数据包/让其自动提供子网中的让其自动提供子网中的IPIP广播地址广播地址IPEndPoint IPEndPoint iepiep = new IPEndPoint(IPAddress.Broadcast,
26、6788); = new IPEndPoint(IPAddress.Broadcast,6788);/设设置置BroadcastBroadcast值值为为1 1表表示示允允许许套套接接字字发发送送广广播播信信息息,该该值值默认为默认为0 0(不允许)(不允许)socket.SetSocketOption(SocketOptionLevel.Socket,SocketOsocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);ptionName.Broadcast,1);/将发送内容转换为字节数组将
27、发送内容转换为字节数组byte bytes =byte bytes =System.Text.Encoding.Unicode.GetBytes(this.textBox1.TexSystem.Text.Encoding.Unicode.GetBytes(this.textBox1.Text);t);/向子网发送信息向子网发送信息socket.socket.SendToSendTo(bytes,(bytes,iepiep);socket.Close(););socket.Close();20程序实例二程序实例二接收广播数据包接收广播数据包 创建一个创建一个Windows应用程序。应用程序。设设
28、 置置 Form1的的 属属 性性 【 Text】 属属 性性 值值 为为 【 提提 示示 】 ; 【FormBorderStyle】属属性性值值为为【FixedDialog】;【MaximizeBox】属属性性值值为为【false】;【MinimizeBox】属属性性值值为为【false】。向向窗体拖放一个窗体拖放一个Label控件,两个控件,两个Button控件,界面如图控件,界面如图21 调用的方法。调用的方法。private void AcceptMessage()Socket socket=new Socket(AddressFamily.InterNetwork,SocketTyp
29、e.Dgram,ProtocolType.Udp);IPEndPoint iep = new IPEndPoint(IPAddress.Any,6788);socket.Bind(iep);EndPoint ep=(EndPoint)iep;Byte bytes = new byte1024;while(true)socket.ReceiveFrom(bytes,ref ep);string receiveData=System.Text.Encoding.Unicode.GetString(bytes);receiveData=receiveData.TrimEnd(u0000)+nn你你想
30、想继继续续接接收收此此类类消消息息吗吗?n;string message=来来自自+ep.ToString()+的的消消息息;DialogResult result=MessageBox.Show(receiveData,message,MessageBoxButtons.YesNo);if(result=DialogResult.No)break;socket.Close();22【重新接收【重新接收】按钮的按钮的Click事件代码。事件代码。private void button1_Click(object sender, System.EventArgs e)AcceptMessage(
31、);【退出系统退出系统】按钮的按钮的Click事件代码。事件代码。private void button2_Click(object sender, System.EventArgs e)this.Close();23程序实例程序实例二二接收广播数据包接收广播数据包运行结果运行结果发送端运行界面 接收端界面 选择“否”的界面 24程序实例三程序实例三UdpClient组播组播 发送方发送方static void Main()UdpClient uc=new UdpClient();IPEndPoint iep=new IPEndPoint(IPAddress.Parse(224.100.0.1
32、),6788);byte bytes=System.Text.Encoding.Unicode.GetBytes(This is a test Message);uc.Send(bytes,bytes.Length,iep);uc.Close();25接受方接受方public static void Main()public static void Main()UdpClientUdpClient ucuc=new UdpClient(6788);=new UdpClient(6788);uc.JoinMulticastGroup(IPAddress.Parse(224.100.0.1uc.J
33、oinMulticastGroup(IPAddress.Parse(224.100.0.1),50);),50);IPEndPointIPEndPoint iepiep=new IPEndPoint(IPAddress.Any,0);=new IPEndPoint(IPAddress.Any,0);byte bytes=byte bytes=ucuc.Receive(ref .Receive(ref iepiep););string string strstr=System.Text.Encoding.Unicode.GetString(bytes,=System.Text.Encoding.Unicode.GetString(bytes,0,bytes.Length);0,bytes.Length);Console.Console.WriteLineWriteLine( (strstr););ucuc.Close();.Close();26程序实例四程序实例四网络会议网络会议 详见教材详见教材