Select 确定winsock(FIONWRITE)可以发送多少字节?

Select 确定winsock(FIONWRITE)可以发送多少字节?,select,winsock,send,recv,Select,Winsock,Send,Recv,使用select,我可以确定是否可以在不阻塞的情况下接收或发送任何字节 使用此函数,我可以确定可以接收多少字节: function BytesAvailable(S: TSocket): Integer; begin if ioctlsocket(S, FIONREAD, Result) = SOCKET_ERROR then Result := -1; end; 有没有办法确定可以发送多少字节 所以我可以确定,当我用N个字节调用send时,它将返回N个字节的sent(或SOCKE

使用select,我可以确定是否可以在不阻塞的情况下接收或发送任何字节

使用此函数,我可以确定可以接收多少字节:

function BytesAvailable(S: TSocket): Integer;
begin
  if ioctlsocket(S, FIONREAD, Result) = SOCKET_ERROR then
    Result := -1;
end;
有没有办法确定可以发送多少字节

所以我可以确定,当我用N个字节调用send时,它将返回N个字节的sent(或SOCKET_错误),但不会少于N个字节(send buffer已满)

FIONWRITE不适用于Winsock。

,Windows中没有此类功能。他还提到“好的套接字代码”不像ioctls那样使用FIONWRITE,但没有解释原因

为了避免这个问题,您可以在感兴趣的套接字上启用非阻塞I/O(我想是使用)。这样,
WSASend
将在这样的套接字上成功,当它可以在不阻塞的情况下完成发送时,或者在缓冲区已满(如中所述)时,由于
WSAGetLastError()==WSAEWOULDBLOCK而失败:

WSAEWOULDBLOCK

重叠套接字:存在太多未完成的重叠I/O请求。非重叠套接字:套接字标记为非阻塞,无法立即完成发送操作


也可以读取。

Winsock send()仅在套接字以阻塞模式运行且套接字的出站缓冲区充满排队数据时才会阻塞。如果在同一线程中管理多个套接字,请不要使用阻塞模式。如果一个接收器没有及时读取数据,它可能会导致该线程上的所有连接受到影响。改为使用非阻塞模式,然后send()将报告套接字何时进入阻塞将发生的状态,然后可以使用select()检测套接字何时可以再次接受新数据。更好的选择是使用重叠的I/O或I/O完成端口。将出站数据提交到操作系统,让操作系统处理等待您的所有数据,并在数据最终被接受/发送时通知您。在收到通知之前,不要提交给定套接字的新数据。为了扩展到大量连接,I/O完成端口通常是一个更好的选择。

我读过一些指南,其中说“严重的应用程序使用非阻塞IO”,因为关于阻塞行为的文档不明确,即使有文档,移植性也很差。