搜索引擎网站提交入口,北京有哪些软件公司,网站admin目录名怎么改,做网站好学吗前一节我们实现了基于RAW API的UDP服务器#xff0c;在接下来#xff0c;我们进一步利用RAW API实现UDP客户端。 
1、UDP协议简述 
UDP协议全称是用户数据报协议#xff0c;在网络中它与TCP协议一样用于处理数据包#xff0c;是一种无连接的协议。在OSI模型中#xff0c;处…前一节我们实现了基于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控制块连接到指定服务器的地址及端口同样由于我们的验证比较简单我们采用回环服务器端口。然后注册回调函数发起客户端首次通讯。具体代码如下 
/* UDP客户端初始化配置 */
void UDP_Client_Initialization(void)
{ip_addr_t DestIPaddr;err_t err;struct udp_pcb *upcb;char data[]This is a Client.;/* 设置服务器端的IP地址 */IP4_ADDR( DestIPaddr,udpServerIP[0],udpServerIP[1],udpServerIP[2],udpServerIP[3]);/* 创建一个新的UDP控制块 */upcb  udp_new();if (upcb!NULL){/* 服务器端地址、端口配置 */err udp_connect(upcb, DestIPaddr, UDP_ECHO_SERVER_PORT);if (err  ERR_OK){/* 注册回调函数 */udp_recv(upcb, UDPClientCallback, NULL);/**数据发送第一次连接时客户端发送数据至服务器端发送函数中会遍历查找源IP地址的配置如果源IP地址未配置则数据发送失败。该处出现的问题在后面总结中提到了**/UdpClientSendPacket(upcb,data);}}
} 
其次实现UDP客户端的具体实现内容。由于我们实现的简单的响应客户端所以我们只是给服务器回复相同的内容。 
/* 定义UDP客户端数据处理回调函数 */
static void UDPClientCallback(void *arg,struct udp_pcb *upcb,struct pbuf *p,const ip_addr_t *addr,u16_t port)
{udp_send(upcb, p);     //数据回显pbuf_free(p);
}
/* 客户端数据发送函数 */
void UdpClientSendPacket(struct udp_pcb *upcb,char* data)
{struct pbuf *p;/* 分配内存空间 */p  pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL);if (p ! NULL){/* 复制数据到pbuf */pbuf_take(p, (char*)data, strlen((char*)data));/* 发送数据 */udp_send(upcb, p);     //发送数据/* 释放pbuf */pbuf_free(p);}
} 
当然如果我们不想人云亦云的回复服务器则可以编辑我们自己的数据包然后发送回去。所以我们想要实现复杂的应用时只需要重新编写合适的回调函数就可以了 
4、结论 
我们完成了简单的基于RAW API的UDP客户端其本身并不复杂。同样的我们使用网络软件测试其功能我们在电脑上建立一个服务器端然后通过我们这个客户端去连接它。能够进行连接并发送接受数据说明我们这个客户端的设计是符合要求的。 
至此我们完成了UDP客户端及服务器的实现后续我们将在次基础上实现更为复杂的应用。 
欢迎关注