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

来源:互联网 发布:在淘宝买衣服好吗 编辑:程序博客网 时间:2024/06/12 23:06

这里不讨论直接调用后,通过返回值返回错误号的情况,因为这种情况是比较简单的。而实际在网络编程中很多情况都是在发送和接收数据时出现了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
原创粉丝点击