我是否必须等待带有 select() 的信号才能在非阻塞套接字中发送一些东西?如果我总是有东西要发送,然后我调用 send() 函数怎么办?我的意思是,每次我调用 send() 时,肯定会有一些固定长度的数据要发送。这是否意味着 send 不会阻塞?
问问题
382 次
2 回答
3
send
对非阻塞套接字的调用永远不会阻塞。如果无法发送数据(例如发送缓冲区已满),send
则将立即返回SOCKET_ERROR
.
任何会阻塞的调用都由WSAEWOULDBLOCK
(通过调用 WSAGetLastError
)的错误代码发出信号。
对 的调用也是如此receive
,如果接收缓冲区中没有数据,调用仍然会立即返回,但会报错。
于 2012-05-19T20:29:22.117 回答
0
这取决于协议。使用常规阻塞 TCP 套接字send()
可能会阻塞,因为内核套接字缓冲区可能已满。另一方面,UDP 会将数据包向下推入堆栈,或者如果它太大则丢弃它,而不会阻塞。
编辑0:
好的,感谢@Cicada,我看到我错过了我们正在谈论非阻塞套接字,所以......
它仍然取决于协议 - 使用 UDP,您的数据包要么被发送,要么被丢弃;使用 TCP,您尝试在有数据时发送,如果您使用/EWOULDBLOCK
注册您的套接字,并在内核告诉您套接字再次可写时重新尝试发送。select()
poll()
于 2012-05-19T20:41:35.167 回答