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++ 项目的引用有啥后果?

错误 C2660:函数不接受 2 个参数 C++

接受对抽象类的 const 引用的 C++ 构造函数无法初始化 std::map

C++ 关于内存泄露问题。内存泄露是指用new 分配的内存没有用delete释放,如果未释放会有啥后果?