UDP服务器是做什么用的?

UDP服务器是做什么用的?,第1张

UDP服务器,就是首发数据,进行数据处理的。与TCP不同的是不用建立连接,直接调用recvfrom来收包。\x0d\x0a开始就是基本的socket初始化地址什么的。\x0d\x0a要求多个线程处理客户端命令,那recvfrom收包后,考虑把客户端的地址信息保存,便于sendto,对接收的数据包,交给线程进行处理,每个线程可以向一块共享内存、队列里写入收到的数据和对应的客户端信息,每次写的时候对这块共享资源加锁,多个线程对共享资源读是加锁,读完解锁,并开始处理数据。\x0d\x0a处理完,用sendto发回去。\x0d\x0a不是什么大项目。小程序而已。

UDP是面向无连接的,使用起来比较简单,打开socke之后,指定目标端口,直接进行接收和发送:

socket本身提供了一些接口:

需要注意的是, boost.asio.buffer 是一种接口适配器,通过接口进行发送和接收,必须有对应的数据缓冲区提供数据或者存储空间。

同步接收同步发送的UDP服务器也比较简单,创建一个绑定到本地端口的socket,然后就是接收及发送动作:

同步操作是不需要运行IO服务的,以最常规的方式来进行发送和接收,注意接收时如果接收到全部消息,即EOF也是通过报错形式,错误码为 error::message_size 。

实现异步的UDP服务器就略显复杂,需要保证IO服务运行,发起异步操作时要注意数据缓冲区生命周期:

可以看到 do_recv 方法发起了一个异步接收操作,在操作完成回调中再次发起,构造服务器时率先调用了 do_recv ,从而保证IO服务一直运行。

do_recv 方法在发起异步操作前申请了一块内存,接收的内容被保存在这块内存之中,当 do_send 发起异步发送操作时被借用,直到发送完成才将这段内存释放掉。

在构造函数中启动了一个线程来执行IO服务,并detach掉线程,从而保证服务器不阻塞,在析构函数停止了IO服务。

需要注意到的是 remote_ep_ 在执行 do_send 时被 move 了,由于 remote_ep_ 标识了远程端口,而且被声明为成员变量,在接受操作中会被填充远程端口内容,如果多个远程主机同时发起,单个 remote_ep_ 是无法正常处理的,所以一旦内容被填充后,就会转移出去给发送操作使用[个人理解,没有实际测试和验证]。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/262973.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存