c++异网正确使用接受
Posted fqbqrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++异网正确使用接受相关的知识,希望对你有一定的参考价值。
正确使用受者
异网受者
有通过端点
构造的重载函数
,创建受者
之后就可以接受
了,代码如下:
用 异网::ip::传控;
传控::受者 受者(io环境,传控::端点(传控::v4(),端口));
受者.异步接受(套接字,[](异网::错误码 ec));
该代码一般情况下
没问题,但是如果端口被占用
就会抛异常,需要注意捕获异常
.
如果不希望抛异常
,则需要先监听
端口再接受
,如果监听
失败就返回错误码
.
传控::受者 受者(io环境);
受者.打开(端点.协议());
受者.置选项(提升::异网::ip::传控::受者::重用地址(真));
异网::错误码 ec;
受者.绑定(端点,ec);
如(ec)
输出<<"绑定端口失败"<<ec.消息()<<"\\n";
中 ec;
受者.听();
这里面需要设置reuse_address
选项,为什么要设置它?该选项对重启
服务器有帮助,当套接字
处于TIME_WAIT
状态时,启动服务器,就会绑定
失败,报已用
地址错误,如果设置了reuse_address(true)
,则可以绑定
成功.为什么第一个
例子中不显式设置该参数
呢,因为通过端点
构造的受者
默认参数
就是reuse_addr=true
.
正确关闭受者
写异步服务器
时,需要通过异步
循环调用异步接受
:
空 服务器::干接受()
受者_.异步接受(
[本](错误码 ec,异网::ip::传控::套接字 套接字)
如(!ec)
连接管_.开始(造共<连接>(
移动(套接字),连接管_,请求处理器_));
异
输出<<ec.消息()<<"\\n";
干接受();
);
需要注意错误处理
,不像异步读写
,它收到错误
时不返回
,而是继续接受
,因为服务器
在某一次接受
失败时,还可继续接受
其它连接,如果返回
了,则整个服务器
不能响应
新连接了.上面代码错误处理还不够,关闭受者
后,整个接受
就会陷入死循环,一直会接受
错误,所以正确
处理错误
方法是接受
之前判断是否已经关闭受者
了.
空 服务器::干接受()
受者_.异步接受(
[本](错误码 ec,异网::ip::传控::套接字 套接字)
如(!受者_.是打开())
中;
...后面相同,略.
);
关闭受者
空 关闭()
错误码 ec
受者_.关闭(ec);
这样,是错误的.会引起不可预测
后果,因为受者
正在异步接受
,这时在另外
线程中去关闭
它,多线程操作受者
会导致未定义
行为,表现为有时候异步_接受
会返回错误,有时候则会挂起
主线程,而不会返回
错误.在异步回调
模式下,该错误造成影响
似乎不太大
,但在协程
环境下,会导致永远不会返回异步接受
的协程,这时如果再重启
服务端则会出现客户端
连接成功,但永远读
超时.
正确关闭受者
的方法是避免多线程
去操作受者
,通过提交
去关闭它.
空 关闭()
异网::提交(受者_.取执行器(),[]
错误码 ec
受者_.关闭(ec);
);
提交
到受者
的io环境
里,可保证在同一
线程里操作受者
,确保正确关闭
它.
以上是关于c++异网正确使用接受的主要内容,如果未能解决你的问题,请参考以下文章
[4G&5G专题-102]:部署 - LTE频谱以及与其他异网异系统(2G/3G)之间的干扰
在 Visual Studio 中添加对 C++ 项目的引用有啥后果?