套接字操作成功后的SO_ERROR值

时间:2015-04-06 21:24:28

标签: sockets posix

我很好奇在套接字操作成功后,与getsockopt()一起使用的SO_ERROR套接字选项的行为

Open Group specification

  

SO_ERROR       报告有关错误状态的信息并清除它。该选项应存储一个int值。

通常我看到在套接字操作返回-1后使用SO_ERROR,但是如果前一个套接字操作成功(因此不返回-1)会发生什么。 getsockopt()调用失败了吗?它是否返回0作为int值?

3 个答案:

答案 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检索)的一个例子