我很好奇在套接字操作成功后,与getsockopt()一起使用的SO_ERROR套接字选项的行为
SO_ERROR 报告有关错误状态的信息并清除它。该选项应存储一个int值。
通常我看到在套接字操作返回-1后使用SO_ERROR,但是如果前一个套接字操作成功(因此不返回-1)会发生什么。 getsockopt()调用失败了吗?它是否返回0作为int值?
答案 0 :(得分:2)
未定义。只有在您已经知道出现错误时才应该调用此选项。不是发现是否有一个的手段。
答案 1 :(得分:2)
非阻塞连接即可,请参阅connect(2)
套接字是非阻塞的,无法立即完成连接。通过选择用于写入的套接字,可以选择(2)或轮询(2)以完成。 select(2)表示可写性后,使用getsockopt(2)读取SOL_SOCKET级别的SO_ERROR选项,以确定connect()是否成功完成( SO_ERROR为零)或失败(SO_ERROR是通常的一个)此处列出的错误代码,解释失败的原因。)
其他未定义。
答案 2 :(得分:1)
我在Unix Networking Programmig第1卷中学到了更多关于SO_ERROR的知识,我很清楚。 SO_ERROR用于报告由网络堆栈中的事件导致的异步错误,而不是由库调用(send / recv / connect)导致的同步错误。同步结果通过errno报告。
在库调用返回-1后,使用SO_ERROR调用getsockopt()与POSIX实现不一致。
通过select学习非阻塞连接结果是发现异步结果何时就绪(可以通过SO_ERROR检索)的一个例子