boost.asio网络错误码

对于网络编程,无论是底层socket编程还是上层网络库的编程,正常逻辑往往都非常的简单,重要的是对异常逻辑的把握。比如连接错误,往往都会有很多种。

最近项目中用的长连接(TCP)就是基于boost.asio来做的,我们的windows、ios、android都用了这个作为底层网络库。在发生网络错误都会将错误码上报,各平台上报的错误码又不相同,所以深入asio内部查看了一下对于错误码的定义.

#if defined(GENERATING_DOCUMENTATION)
/// INTERNAL ONLY.
# define BOOST_ASIO_NATIVE_ERROR(e) implementation_defined
/// INTERNAL ONLY.
# define BOOST_ASIO_SOCKET_ERROR(e) implementation_defined
/// INTERNAL ONLY.
# define BOOST_ASIO_NETDB_ERROR(e) implementation_defined
/// INTERNAL ONLY.
# define BOOST_ASIO_GETADDRINFO_ERROR(e) implementation_defined
/// INTERNAL ONLY.
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) implementation_defined
#elif defined(BOOST_ASIO_WINDOWS_RUNTIME)
# define BOOST_ASIO_NATIVE_ERROR(e) __HRESULT_FROM_WIN32(e)
# define BOOST_ASIO_SOCKET_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e)
# define BOOST_ASIO_NETDB_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e)
# define BOOST_ASIO_GETADDRINFO_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e)
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) e_win
#elif defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
# define BOOST_ASIO_NATIVE_ERROR(e) e
# define BOOST_ASIO_SOCKET_ERROR(e) WSA ## e
# define BOOST_ASIO_NETDB_ERROR(e) WSA ## e
# define BOOST_ASIO_GETADDRINFO_ERROR(e) WSA ## e
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) e_win
#else
# define BOOST_ASIO_NATIVE_ERROR(e) e
# define BOOST_ASIO_SOCKET_ERROR(e) e
# define BOOST_ASIO_NETDB_ERROR(e) e
# define BOOST_ASIO_GETADDRINFO_ERROR(e) e
# define BOOST_ASIO_WIN_OR_POSIX(e_win, e_posix) e_posix
#endif

这是asio对各平台错误码的一个封装,能看出asio将错误码归类为3中,第一种应该是为文档留的,三种分别是:

  1. windows-runtime 这是windows的跨平台框架,用来开发windows跨平台应用的。
  2. windows,也是我们最常用的windows native原生应用
  3. posix标准兼容系列,包括linux、android、ios、mac他们都是。

所以对平台错误码收拢也就是两类,windows和posix。

通过上面的宏定义就能看出来,windows上

# define BOOST_ASIO_SOCKET_ERROR(e) WSA ## e
# define BOOST_ASIO_NETDB_ERROR(e) WSA ## e
# define BOOST_ASIO_GETADDRINFO_ERROR(e) WSA ## e

posix系列:

# define BOOST_ASIO_SOCKET_ERROR(e) e
# define BOOST_ASIO_NETDB_ERROR(e) e
# define BOOST_ASIO_GETADDRINFO_ERROR(e) e

这些错误在windows上都被拼上WSA前缀对应到了winsock的错误码上,而在posix系列上则是跟原生socket错误码一一对应,。比如:

  /// Connection reset by peer.
  connection_reset = BOOST_ASIO_SOCKET_ERROR(ECONNRESET),

windows上是 connection_reset = WSAECONNRESET = 10054L;

ios上是 connection_reset = ECONNRESET = 54

linux上是 connection_reset = ECONNRESET = 104

对于该错误的描述都是被远程主机强制关闭。从这里也可以看出现有的操作系统框架,基本就可以分为:Windows和Posix标准系列(unix\linux\android\mac\ios).

你可能感兴趣的:(Boost,C++)