网络编程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上的错误码无疑是最准确地。
因此,综上所述,这些错误信息获取方式各有优缺点和适宜的场景,大家可以根据使用场景,合理的去调用。
- 网络编程socket相关错误号及信息的获取
- java网络编程----------获取Socket信息
- 网络(2):网络配置&socket编程相关的函数选项及异常处理
- socket网络编程的相关函数
- socket 编程及相关的点评
- 获取屏幕像素及相关的信息
- 网络及socket编程
- 网络socket编程相关函数
- Android 获取网络相关信息
- 使用c#进行socket编程时,获取网卡的信息
- 网络编程中tcp,socket,http 的相关知识
- 获取网络适配器的相关信息(包括网络连接名称)
- 搜索局域网,获取网络中的相关信息出现的问题
- 如何从网络上获取可靠、相关的信息
- linux编程获取网络信息
- Socket网络编程及实例
- [python&php 网络编程]socket的错误捕捉
- Windows Socket 网络编程(五) —— 获取本地主机信息
- Python网络爬虫(Get、Post抓取方式)
- 约瑟夫问题(猴子大王)
- BestCoder Round #43 HDU5265 pog loves szh II 排序+贪心
- socket的发送与接收缓冲区
- HDOJ1019Least Common Multiple
- 网络编程socket相关错误号及信息的获取
- 浅谈UIScrollView的用法
- iOS大典之Core Data
- openlayers中设置地图缩放级别
- 《C语言程序设计(第二版新版)》课后练习
- group by 子句的细节
- 【Foundation-86-3】#import <Foundation/NSValue.h> 初始化
- eclipse的快捷键
- MyBatis入门09之整合spring