• 网络编程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 ) 作为错误代码。
    所以使用gai_strerror的主要是为了统一OS的转换的getnameinfo 、getaddrinfo 之类的函数,需要尤其注意。
    缺点:其参数是getnameinfo 、getaddrinfo 之类的函数的执行后的返回值,所以只适用于特定范围。

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

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

  • 相关阅读:
    sparksql的SQL风格编程
    2023年09月编程语言流行度排名
    10.4 认识Capstone反汇编引擎
    VPS和云服务器的区别
    2023-10-03 VsCode诡异消失事件
    Maven中央仓库地址大全
    知识库文档处理
    赴日开发工程师是做什么的?
    (微信开发)Laya转发H5网页到微信,带图片
    保卫城市消费券安全,从这些做起
  • 原文地址:https://blog.csdn.net/m0_67401761/article/details/126616427