网络编程socket相关错误号及信息的获取

这里不讨论直接调用后,通过返回值返回错误号的情况,因为这种情况是比较简单的。而实际在网络编程中很多情况都是在发送和接收数据时出现了socket上有异常导致操作无法完成,而返回值只能涉及到操作相关的字节数和是否错误,并不能反映完全的错误信息。
也不讨论windows上的错误信息获取,而主要是Linux上的。
实际的常用方法如下:
方法一:strerror
这个函数以及errno全局变量是最常用的获取Linux中错误信息的函数。因此使用起来相当顺手,而且这个函数也可以捕捉所有的Linux中的错误,因为其使用的错误号是全局变量。
劣势也在于此:在获取这个错误时不能完全保证这个错误信息就是之前的,很由可能在获取该信息时错误号和错误信息已经再度更新修改了,会造成误判。在网络编程中,特别是在异步的网络操作时,检测到错误后,再去获取错误是又时间差的,容易被覆盖修改。

方法二:gai_strerror
有很多socket相关的函数的错误号和错误信息是无法通过errno,strerror(errno)函数去获取的。其原因在于很多函数并没有将errno.h作为错误码:
相关说明:
if getaddrinfo fails, we can’t use perror or strerror to generate an error message. Instead, we need to call gai_strerrorto convert the error code returned into an error message.
下面的 getnameinfo 也用 gai_strerror 收集错误信息。
这也是不能用 perror or strerror 处理的原因,因为它没有用 errno(#include <errno.h>) 作为错误代码。
所以使用gai_strerror的主要是为了统一OS的转换的getnameinfo 、getaddrinfo 之类的函数,需要尤其注意。
缺点:其参数是getnameinfo 、getaddrinfo 之类的函数的执行后的返回值,所以只适用于特定范围。

方法三:getsockopt(第三个参数SO_ERROR)
这个函数将获取fd上的错误信息。如果epoll获取select、poll检测到fd上有异常,那么通过getsockopt的SO_ERROR来获取fd上的错误码无疑是最准确地。

因此,综上所述,这些错误信息获取方式各有优缺点和适宜的场景,大家可以根据使用场景,合理的去调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值