0

我是否必须等待带有 select() 的信号才能在非阻塞套接字中发送一些东西?如果我总是有东西要发送,然后我调用 send() 函数怎么办?我的意思是,每次我调用 send() 时,肯定会有一些固定长度的数据要发送。这是否意味着 send 不会阻塞?

4

2 回答 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 回答