send()会自动变为非阻塞吗?

时间:2012-05-19 20:09:56

标签: c++ winsock send

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

2 个答案:

答案 0 :(得分:3)

send的调用永远不会阻塞非阻塞套接字。如果无法发送数据(例如,如果发送缓冲区已满),则send将立即返回值SOCKET_ERROR

任何阻止的呼叫都会被错误代码WSAEWOULDBLOCK(通过调用WSAGetLastError)发出信号。

receive的调用也是如此,如果接收缓冲区中没有数据,则调用仍会立即返回,并显示错误。

答案 1 :(得分:0)

这取决于协议。使用常规阻塞时,TCP套接字send()可能会阻塞,因为内核内套接字缓冲区可能已满。另一方面,UDP会将数据包推入堆栈,如果数据包太大而无法阻止,则将其丢弃。

编辑0:

好的,感谢@Cicada,我看到我错过了我们所说的非阻塞套接字,所以......

它仍然取决于协议 - 使用UDP,您的数据包被发送或丢弃;使用TCP,您尝试在获得数据时发送,如果获得EWOULDBLOCK,则使用select() / poll()注册套接字,并在内核告诉您套接字时重新尝试发送是可写的。