SO_ERROR套接字操作成功后的值

SO_ERROR value after successful socket operation

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

Open Group specification

SO_ERROR Reports information about error status and clears it. This option shall store an int value.

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

未定义。仅当您已经知道出现错误时才应调用此选项。不是作为发现是否存在的一种手段。

非阻塞连接没问题,见connect(2)

The socket is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the socket for writing. After select(2) indicates writability, use getsockopt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the reason for the failure).

其他未定义。

我在 Unix Networking Programmig Vol 1 中学到了更多关于 SO_ERROR 的知识,这对我来说变得很清楚了。 SO_ERROR 用于报告网络堆栈中事件导致的异步错误,而不是库调用 (send/recv/connect) 导致的同步错误。同步结果通过 errno 报告。

在库调用 returns -1 之后使用 SO_ERROR 调用 getsockopt() 从 POSIX 实现中是不正确的。

通过 select 学习非阻塞连接结果是发现异步结果何时准备就绪的示例(然后可以通过 SO_ERROR 检索)