预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共26页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第十一章UDP协议开发11.1UDP协议概述SendTo()方法和ReceiveFrom()方法 UDP无需建立连接,可在任何时候直接向网络中的任意主机发送UDP数据包。当然须指明目标地址,可以直接用SendTo()方法完成这个功能。将创建的套接字与本地IPEndPoint进行绑定后,也可以用ReceiveFrom()方法接收远程主机发来的数据。 使用这种方法,发送和接收UDP数据包的一般步骤为: 1)创建一个Socket对象。 2)如果要接收UDP数据包,需要将创建的套接字与本地IPEndPoint进行绑定。如果仅仅为了发送,则不需要绑定。 3)使用SendTo()方法和ReceiveFrom()方法发送和接收数据包。Send()方法和Receive()方法 为了和某一个远程主机通信,也可以在创建套接字后,使用Connect()方法先和远程主机建立连接,然后直接用Send()方法和Receive()方法发送和接收数据。 由于使用的是UDP数据包套接字,在通信中并没有实际的链路,但是Connect()方法将套接字信息设置到IPEndPoint对象后,Send()方法和Receive()方法就可以自动使用IPEndPoint对象的信息。 解决UDP数据丢失问题 UDP不保证数据被真正传送到目的地。 解决方法 要求远程主机返回一个应答信息,表明已经接收到发送的数据,如果在规定时间内没有收到返回的应答信息,就认为该数据包已经丢失,然后重新发送刚才发送的数据包。 实现步骤为 1)向远程主机发送一条消息。 2)等待远程主机回送应答信息。 3)如果收到应答信息,则退出本循环,继续发送下一条消息。如果在规定时间内没有收到应答信息,则重新发送。 4)检查重复发送次数,如果达到规定的重复次数,则终止发送,并显示相关错误信息。程序实例一——使用SendTo()和ReceiveFrom() publicstaticvoidMain(){ intlength;byte[]bytes=newbyte[1024]; Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); IPEndPointmyHost=newIPEndPoint(IPAddress.Any,6789); socket.Bind(myHost); IPEndPointremote=new IPEndPoint(IPAddress.Parse("127.0.0.1"),6789); EndPointremoteHost=(EndPoint)remote; Console.Write("输入发送的信息:"); stringstr=Console.ReadLine(); bytes=System.Text.Encoding.Unicode.GetBytes(str);socket.SendTo(bytes,bytes.Length,SocketFlags.None,remoteHost); while(true) {Console.WriteLine("等待接收..."); length=socket.ReceiveFrom(bytes,refremoteHost); 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();}程序实例二——使用Send()和Receive() publicstaticvoidMain(){ intlength;byte[]bytes=newbyte[1024]; Socketsocket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); IPEndPointmyHost=newIPEndPoint(IPAddress.Any,6789); socket.Bind(myHost); IPEndPointremote=new