怎么可能connect()失败并将errno设置为EADDRINUSE

时间:2017-04-04 05:36:00

标签: c sockets posix

我正在编写一些关键代码,并且需要一次使用connect()建立TCP连接。

我深入研究POSIX手册以确保我的代码完全符合POSIX标准,并且必须编写涵盖所有可能错误情况的单元测试。

考虑到这个document,我无法理解以下含义:

  

EADDRINUSE   尝试建立使用已在使用的地址的连接。

乍一看,我认为我可以通过缺少短暂的端口来触发,但EADDRNOTAVAIL(我在单元测试中成功触发)报告了此错误。

具体来说,这是什么意思?哪种情况可能导致此错误?我理解bind()上此错误的语义,但connect()怎么能提出这个?

2 个答案:

答案 0 :(得分:1)

我的感觉,虽然这是猜测,但是这个错误适用于非TCP套接字,特别是unix套接字 - AF_UNIX (also known as AF_LOCAL)

linux connect() mangpage与您链接的内容略有不同:

  

EADDRINUSE                 本地地址已被使用。

使用“本地”一词让我看到unix manpage,其中说明了

  

EADDRINUSE                 指定的本地地址已在使用或                 文件系统套接字对象已经存在。

答案 1 :(得分:0)

在您提供的链接中,它说:

如果套接字尚未绑定到本地地址,则connect()应将其绑定到一个地址,除非套接字的地址族是AF_UNIX,否则该地址是未使用的本地地址。

这可能会触发您提到的错误。