CUDP通讯入门与简单示例

上传人:小** 文档编号:159595024 上传时间:2022-10-09 格式:DOC 页数:7 大小:102.50KB
返回 下载 相关 举报
CUDP通讯入门与简单示例_第1页
第1页 / 共7页
CUDP通讯入门与简单示例_第2页
第2页 / 共7页
CUDP通讯入门与简单示例_第3页
第3页 / 共7页
点击查看更多>>
资源描述
用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。OSI参IETFUDP和TCP协议正数据发送一方(可收一方则通过目标而另外一些网络应数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为字节。不过,一些实际应用往往会限制数据报的大小,UDP协议使用报头中的校验值来保证数据的安全。殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果数据报的最大长65535有时会降低到8192字节。校验值首先在数据发送方通过特某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。许多链路层协议都提供错误检查,包括流行的以太网协议,也许想知道为什么UDP也要提供检查和。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。UDP协议的几个特性(1)UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。(2)由于传输数据不建立连接,因此一台服务机可同时向多个客户机传输相同的消息。(3DUDP信息包的标题很短,只有因此也就不需要维护连接状态,包括收发状态等,8个字节,相对于TCPO20个字节信息包的额外开销很小。(4D吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。(5DUDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数D。UDP是UserDatagramProtocolODO,中文名是用户数据包协议,是考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是RFC768是UDP的正式规范。UDP报头UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号目标端口号数据报长度校验值UDP协议使用端口号为不同的应用保留其各自的数据传输通道。是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIPDRoutingInformationProtocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中,例如,ProgressiveNetworks公司开发的RealAudioDO,它是在因特网上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件使用的RealAudioaudio-on-demandprotocol协议就是运行在UDP之Socket的方法来实现上的协议,大多数因特网电话软件产品也都运行在UDP之上。我们先使用服务器代码:服务器代码:日代码usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceUDPclassProgramstaticvoidMain(stringargs)intrecv;bytedata=newbyte1024;/得到本机IP,DOTCP端口号IPEndPointip=newIPEndPoint(IPAddress.Any,8001);Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);/绑定网络地址newsock.Bind(ip);Console.WriteLine(ThisisaServer,hostnameis0,Dns.GetHostName();/等待客户机连接Console.WriteLine(Waitingforaclient);/得到客户机IPIPEndPointsender=newIPEndPoint(IPAddress.Any,0);EndPointRemote=(EndPoint)(sender);recv=newsock.ReceiveFrom(data,refRemote);Console.WriteLine(Messagereceivedfrom0:,Remote.ToString();Console.WriteLine(Encoding.ASCII.GetString(data,0,recv);/客户机连接成功后,发送信息stringwelcome=你好!;/字符串与字节数组相互转换data=Encoding.ASCII.GetBytes(welcome);/发送信息newsock.SendTo(data,data.Length,SocketFlags.None,Remote);while(true)data=newbyte1024;/发送接受信息recv=newsock.ReceiveFrom(data,refRemote);Console.WriteLine(Encoding.ASCII.GetString(data,0,recv);newsock.SendTo(data,recv,SocketFlags.None,Remote);客户端代码:日代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net;usingSystem.Net.Sockets;namespaceUDPClientclassProgramstaticvoidMain(stringargs)bytedata=newbyte1024;stringinput,stringData;/构建TCP服务器Console.WriteLine(ThisisaClient,hostnameis0,Dns.GetHostName();/设置服务IP,设置TCP端口号IPEndPointip=newIPEndPoint(IPAddress.Parse(127.0.0.1),8001);/定义网络类型,数据连接类型和网络协议UDPSocketserver=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);stringwelcome=你好!;data=Encoding.ASCII.GetBytes(welcome);server.SendTo(data,data.Length,SocketFlags.None,ip);IPEndPointsender=newIPEndPoint(IPAddress.Any,0);EndPointRemote=(EndPoint)sender;data=newbyte1024;/对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制intrecv=server.ReceiveFrom(data,refRemote);Console.WriteLine(Messagereceivedfrom0:,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=newbyte1024;recv=server.ReceiveFrom(data,refRemote);stringData=Encoding.ASCII.GetString(data,0,recv);Console.WriteLine(stringData);Console.WriteLine(StoppingClient.);server.Close();下面咱们再来使用UdpClient来实现他们之间的通信服务器端代码日代码usingSystem;usingusingusingSystem.Net;System.Net.Sockets;System.Text;publicclassCustomprivatestaticreadonlyIPAddressGroupAddress=IPAddress.Parse(IP地址);privateconstintGroupPort=11000;privatestaticvoidStartListener()booldone=false;1n,UdpClientlistener=newUdpClient();IPEndPointgroupEP=newIPEndPoint(GroupAddress,GroupPort);trylistener.JoinMulticastGroup(GroupAddress);listener.Connect(groupEP);while(!done)Console.WriteLine(Waitingforbroadcast);bytebytes=listener.Receive(refgroupEP);Console.WriteLine(Receivedbroadcastfrom0:ngroupEP.ToString(),Encoding.ASCII.GetString(bytes,0,bytes.Length);listener.Close();catch(Exceptione)Console.WriteLine(e.ToString();publicstaticintMain(Stringargs)StartListener();return0;客户端代码:日代码usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;publicclassClientprivatestaticIPAddressGroupAddress=IPAddress.Parse(IP地址);privatestaticintGroupPort=11000;privatestaticvoidSend(Stringmessage)UdpClientsender=newUdpClient();IPEndPointgroupEP=newIPEndPoint(GroupAddress,GroupPort);tryConsole.WriteLine(Sendingdatagram:0,message);bytebytes=Encoding.ASCII.GetBytes(message);sender.Send(bytes,bytes.Length,groupEP);sender.Close();catch(Exceptione)Console.WriteLine(e.ToString();args)publicstaticintMain(StringSend(args0);return0;如果您是采用窗体的形式建议使用这种格式,否则在接收数据时可能会出现死机的现象日代码/创建一个子线程Threadthread=newThread(delegate()try/在这里写你的代码catch(Exception);thread.Start();
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!