c - 当非阻塞流套接字连接时调用 getsockname() 是否安全?

标签 c linux sockets posix nonblocking

如果我创建一个流套接字,并将其设置为非阻塞,并且请求它连接到远程主机,并且 connect() 调用返回 EINPROGRESS,对其发出 getsockname() 调用并期望返回的本地地址正确是否安全?

最佳答案

getsockname 返回套接字绑定(bind)的地址。开始连接时的第一件事是将套接字绑定(bind)到本地地址和端口(除非它已经被用户绑定(bind))。这是本地且非阻塞的操作。因此,即使连接仍在进行中,您也应该从 getsockname 获取可用的值。

对于这个论证,我假设您仅在 connect 调用返回 EINPROGRESS 之后调用 getsockname,而不是在 connect 尚未返回时从另一个线程调用 getsockname。该论证还基于以下事实:没有为非阻塞套接字的绑定(bind)系统调用定义特殊行为。这表明绑定(bind)本身不会阻塞。此外,在路由表中查找以确定用于连接的本地地址也应该仅使用现有的内核数据,因此不会阻塞。

关于c - 当非阻塞流套接字连接时调用 getsockname() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333547/

相关文章:

c - Linux蓝牙编程

java - 为什么这个 Java 套接字客户端无法工作?

c - 在 C 中创建主管进程

c - 解释这个程序的输出

c - 如何根据从文件读取的字符确定数组的大小?

Linux 自动启动脚本在/etc/init.d/

改变静态数组

.net - 使用TCP或UDP套接字的VB 2008在线聊天应用程序

C - 使用 select() 时如何限制服务器中的入站连接数

c - 为队列实现删除函数时出现原型(prototype)声明错误