c语言sscanf函数的用法是什么
199
2024-01-24
前一节我们实现了基于RAW API的UDP服务器,在接下来,我们进一步利用RAW API实现UDP客户端1、UDP****协议简述UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,处于传输层,是IP协议的上层协议UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
一个典型的数据包就是一个二进制数据的传输单位每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号、目标端口号、数据报长度、校验值。
其数据结构如下:
UDP协议使用端口号为不同的应用保留其各自的数据传输通道UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535一般来说,大于49151的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总字节数因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分数据报的最大长度根据操作环境的不同而各异从理论上说,包含报头在内的数据报的最大长度为65535字节。
不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节UDP协议使用报头中的校验值来保证数据的安全校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以。
检测是否出错2、UDP****客户端设计前面我们简要的介绍了UDP协议及其数据报,接下来我们将考虑怎么实现基于UDP协议的客户端首先,我们来看一看与UDP相关的API函数,并对它们作一个初步的介绍,应为我们需要使用它们来实现我们的应用。
函数及说明如下:
我们已经了解了UDP服务器的实现步骤,接下来我们说明一下UDP客户端的实现步骤首先,依然是创建一个新的UDP控制块接下来,建立与服务器的连接,配置包括服务器的地址、端口等信息接下来,如果连接无问题,则注册客户端回调函数。
与服务器端的实现一样,其复杂程度与需要实现的功能相关我们只是实现一个简单UDP客户端,所以我们向服务器发送固定的信息,收到回复后继续发送对应的信息最后,由于客户端是对话的发起方,所以在注册完回调函数后,客户端要发起首次对话。
3、UDP****客户端实现对UDP服务器端的实现,我们依然将器分为两方面内容:一是,UDP客户端的初始化配置部分;二是,UDP客户端的具体实现内容,也就是回调函数的内容首先实现UDP客户端的初始化配置部分。
定义新的UDP控制块,连接到指定服务器的地址及端口,同样由于我们的验证比较简单我们采用回环服务器端口然后注册回调函数,发起客户端首次通讯具体代码如下:复制1/* UDP客户端初始化配置 */2voidUDP_Client_Ini
tialization(void) 3 { 4ip_addr_t DestIPaddr; 5err_t err; 6structudp_pcb *upcb;7char data[]="This is a Client."
; 89/* 设置服务器端的IP地址 */10IP4_ADDR( &DestIPaddr,udpServerIP[0],udpServerIP[1],udpServerIP[2],udpServerIP[
3]); 1112/* 创建一个新的UDP控制块 */13 upcb = udp_new(); 1415if (upcb!=NULL) 16 { 17/* 服务器端地址、端口配置 */18 err=
udp_connect(upcb, &DestIPaddr, UDP_ECHO_SERVER_PORT); 1920if (err == ERR_OK) 21 { 22/* 注册回调函数 */23
udp_recv(upcb, UDPClientCallback, NULL); 24/**数据发送,第一次连接时客户端发送数据至服务器端,发送函数中会遍历查找源IP地址的配置,如果源IP地址未配置,则数据发送失败。
该处出现的问题在后面总结中提到了**/25UdpClientSendPacket(upcb,data); 26 } 27 } 28 } 其次实现UDP客户端的具体实现内容由于我们实现的简单的响应客户端,所以我们只是给服务器回复相同的内容。
复制1/* 定义UDP客户端数据处理回调函数 */2staticvoidUDPClientCallback(void *arg,struct udp_pcb *upcb,struct pbuf *p,const
ip_addr_t *addr,u16_t port) 3 { 4udp_send(upcb, p); //数据回显56pbuf_free(p); 7 } 89/* 客户端数据发送函数 */
10voidUdpClientSendPacket(struct udp_pcb *upcb,char* data) 11 { 12structpbuf *p;1314/* 分配内存空间 */15 p =
pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL); 1617if (p != NULL) 18 { 1920/* 复制数据到pbuf */
21pbuf_take(p, (char*)data, strlen((char*)data)); 2223/* 发送数据 */24udp_send(upcb, p); //发送数据2526/* 释放pbuf */
27pbuf_free(p); 28 } 29 } 当然,如果我们不想人云亦云的回复服务器,则可以编辑我们自己的数据包然后发送回去所以我们想要实现复杂的应用时,只需要重新编写合适的回调函数就可以了!。
4、结论我们完成了简单的,基于RAW API的UDP客户端,其本身并不复杂同样的我们使用网络软件测试其功能,我们在电脑上建立一个服务器端,然后通过我们这个客户端去连接它能够进行连接并发送接受数据,说明我们这个客户端的设计是符合要求的。
至此我们完成了UDP客户端及服务器的实现,后续我们将在次基础上实现更为复杂的应用。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~