SO_ERROR vs. errno

Fél*_*ant 7 c unix sockets errno getsockopt

为了获得socket syscall(like recv)错误,哪个更好(在性能级别)?

  • 使用普通的旧 errno
  • 或者SO_ERROR用作getsockopt()optname?

我认为errno(__error()在我的系统上定义)更快,因为它不是系统调用.我对吗 ?

SO_ERROR的优点是:获取后自动错误重置,我们确信错误只涉及我们的套接字.它更安全.

你觉得哪一个更好?这两者之间的性能真的不同吗?

rob*_*off 5

引用丹·伯恩斯坦

情况:您设置了一个非阻塞套接字,并执行了一个connect()来返回-1 / EINPROGRESS或-1 / EWOULDBLOCK。您选择()套接字的可写性。连接成功或失败后将立即返回。(例外:在某些旧版本的Ultrix中,select()在75秒超时之前不会注意到失败。)

问题:select()返回可写性后,您会怎么做?连接失败了吗?如果是这样,它是怎么失败的?

如果连接失败,则原因被隐藏在套接字中的so_error中。现代系统使您可以通过getsockopt(,, SO_ERROR ,,)看到so_error ...

他接着讨论了一个事实,getsockopt(,,SO_ERROR,,)即现代发明在旧系统上不起作用,以及如何在此类系统上获取错误代码。但是,如果您正在为过去15年中发布的Unix / Linux系统编程,则可能不必担心。

的Linux手册页connect描述了的相同用法SO_ERROR

因此,如果您要在套接字上执行异步操作,则可能需要使用SO_ERROR。在其他情况下,只需使用即可errno