提问人:Mecki 提问时间:10/26/2023 更新时间:10/26/2023 访问量:13
UDP 套接字的非阻塞连接失败,并显示 EADDRNOTAVAIL?
Non-blocking connect of an UDP socket fails with EADDRNOTAVAIL?
问:
在 macOS 和 iOS 上,我想将 BSD 套接字连接到远程地址 + 端口。代码不会预先知道该套接字是 UDP 还是 TCP 套接字,因此为了防止呼叫阻止出现任何问题,我的代码执行以下操作:connect()
- 使套接字不阻塞
- 呼叫目的地
connect()
- 监视套接字是否变得可写 (
dispatch_source
+DISPATCH_SOURCE_TYPE_WRITE
) - 当它是可写的时,调用以查看连接是否成功。如果此调用成功,则连接成功。
getpeername()
- 如果调用失败,则调用套接字以获取连接错误。
read()
根据这个源 https://cr.yp.to/docs/connect.html,使用 和 是确定非阻塞套接字是否已完成连接、是否成功以及万一不成功时错误是什么的好方法。getpeername()
read()
这在大多数时候都很好用。通常连接成功,所以会,有时连接失败,然后会告诉我一个合理的错误(如或等)getpeername()
read()
no route to host
network down
但是时不时地,我从读取中得到的错误将是()。这是我不明白的错误。我从来没有手动绑定套接字。我只连接了它,所以系统总是可以自由选择它想要用于该套接字的任何接口和源地址;我不在乎。通常,UDP套接字会发生这种情况,该套接字不应以该套接字开头,并且调用应该在后台成功。EADDRNOTAVAIL
Can't assign requested address
connect()
为什么 UDP 套接字的非阻塞连接会失败?EADDRNOTAVAIL
答: 暂无答案
评论
getsockopt(SOL_SOCKET, SO_TYPE)