如果我创建一个流套接字,并将其设置为非阻塞,并且请求它连接到远程主机,并且 connect()
调用返回 EINPROGRESS
,对其发出 getsockname()
调用并期望返回的本地地址正确是否安全?
最佳答案
getsockname 返回套接字绑定(bind)的地址。开始连接时的第一件事是将套接字绑定(bind)到本地地址和端口(除非它已经被用户绑定(bind))。这是本地且非阻塞的操作。因此,即使连接仍在进行中,您也应该从 getsockname 获取可用的值。
对于这个论证,我假设您仅在 connect 调用返回 EINPROGRESS 之后调用 getsockname,而不是在 connect 尚未返回时从另一个线程调用 getsockname。该论证还基于以下事实:没有为非阻塞套接字的绑定(bind)系统调用定义特殊行为。这表明绑定(bind)本身不会阻塞。此外,在路由表中查找以确定用于连接的本地地址也应该仅使用现有的内核数据,因此不会阻塞。
关于c - 当非阻塞流套接字连接时调用 getsockname() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333547/