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_ 是无法正常处理的,所以一旦内容被填充后,就会转移出去给发送操作使用[个人理解,没有实际测试和验证]。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)