c – Boost.Asio调用哪些Boost错误代码/条件?
作者:互联网
我目前正在编写一个使用Boost.Asio作为底层套接字API的TCP I / O工具,我注意到Boost.Asio似乎缺乏关于每个单独操作可能产生特定Boost错误代码/条件的文档(例如函数/方法调用或异步操作).我能找到的所有内容都是错误代码API和一些非正式的错误代码列表,其中没有一个将特定代码与特定操作相关联.
这种明显缺乏文档令人沮丧,因为当您不知道可能的故障模式时,很难编写健壮的代码.甚至不可能给出例子,因为我甚至不相信由于缺乏文档而可能由哪些操作引起的问题.
相比之下,POSIX套接字API在记录故障模式方面非常不错.特别是,它列出了每个函数调用可以生成的errno和返回值.
这个Boost.Asio文档是否存在于某处,我只是没有看到它?或者我应该猜测,反向工程或收集Boost.Asio API各个部分的故障模式的经验数据,以便能够编写使用它的健壮代码?
解决方法:
通常,当Boost.Asio依赖于OS实现时,它既不会指定可能发生错误的条件,也不会指定可能返回的错误代码.失败时Boost.Asio将填充boost :: system :: error_code,如果应用程序能够接收它,例如异步操作或带error_code参数的同步操作重载;否则会抛出包含error_code的异常. documentation声明如下:
Unless otherwise noted, when the behaviour of an asynchronous operation is defined “as if” implemented by a POSIX function, the handler will be invoked with a value of type
error_code
that corresponds to the failure condition described by POSIX for that function, if any. Otherwise the handler will be invoked with an implementation-definederror_code
value that reflects the operating system error.Asynchronous operations will not fail with an error condition that indicates interruption by a signal (POSIX
EINTR
). Asynchronous operations will not fail with any error condition associated with non-blocking operations (POSIXEWOULDBLOCK
,EAGAIN
orEINPROGRESS
; WindowsWSAEWOULDBLOCK
orWSAEINPROGRESS
).
如果错误处理取决于确切的错误代码,那么通常可以使用BSD API mapping documentation来确定正在进行哪些OS调用.然后,可以使用适当的OS文档来确定发生错误的条件和值.错误代码和Boost.Asio错误代码之间的映射位于asio/error.hpp
内,但映射通常非常简单.
标签:c,sockets,boost,boost-asio,boost-system 来源: https://codeday.me/bug/20191009/1875659.html