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