C++ send()是否可以自动变为非阻塞?

C++ send()是否可以自动变为非阻塞?,c++,winsock,send,C++,Winsock,Send,我是否必须使用select()等待信号才能在非阻塞套接字中发送内容?如果我总是有东西要发送,然后我调用send()函数呢?我的意思是,每次调用send(),肯定会有一些固定长度的数据要发送。这是否意味着发送不会阻塞?对send的调用在非阻塞套接字上永远不会阻塞。如果无法发送数据(例如,如果发送缓冲区已满),则send将立即返回值SOCKET\u ERROR 任何可能阻塞的调用都会由错误代码WSAEWOULDBLOCK(通过调用WSAGetLastError)发出信号 对receive的调用也是如

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

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

任何可能阻塞的调用都会由错误代码
WSAEWOULDBLOCK
(通过调用
WSAGetLastError
)发出信号


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

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

任何可能阻塞的调用都会由错误代码
WSAEWOULDBLOCK
(通过调用
WSAGetLastError
)发出信号


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

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

编辑0: 好的,多亏了@Cicada,我发现我错过了我们谈论的非阻塞套接字,所以


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

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

编辑0: 好的,多亏了@Cicada,我发现我错过了我们谈论的非阻塞套接字,所以


它仍然取决于协议-使用UDP,您的数据包要么被发送,要么被丢弃;使用TCP,您尝试在有数据时发送,如果您得到
eWooldblock
,您可以使用
select()
/
poll()
,注册套接字,并在内核告诉您套接字可再次写入时重新尝试发送。

我的意思是:我已经定义了一些非阻塞套接字。我肯定有东西要送。然后我调用send(),它保证发送吗?不,它保证不阻塞。如果它不能发送(例如,如果发送缓冲区已满),那么它将立即返回一个错误。这就是我一直在寻找的答案,很好。那么,谢谢你,把它作为回答!我的意思是:我定义了一些非阻塞套接字。我肯定有东西要送。然后我调用send(),它保证发送吗?不,它保证不阻塞。如果它不能发送(例如,如果发送缓冲区已满),那么它将立即返回一个错误。这就是我一直在寻找的答案,很好。那么,谢谢你,把它作为回答!是的,对于普通的阻塞式插座。(参见OP在其问题下方的第一条评论)。是的,在常规阻塞套接字的情况下。(见OP问题下方的第一条评论)。