通过 select 我可以确定是否可以在不阻塞的情况下接收或发送任何字节。
通过这个函数,我可以确定可以接收多少字节:
function BytesAvailable(S: TSocket): Integer;
begin
if ioctlsocket(S, FIONREAD, Result) = SOCKET_ERROR then
Result := -1;
end;
还有一种方法可以确定可以发送多少字节吗?
因此,我可以确定,当我使用 N 个字节调用 send 时,它将返回已发送的 N 个字节(或 SOCKET_ERROR),但不少于(发送缓冲区已满)。
FIONWRITE 不适用于 Winsock。
根据 MVP 亚历山大·尼科洛夫的说法 http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.networks/2007-11/msg00035.html,Windows中没有这样的功能。他还提到“良好的套接字代码”不使用类似 FIONWRITE 的 ioctl,但没有解释原因。
要避免此问题,您可以启用非阻塞 I/O(使用FIONBIO http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573%28v=vs.85%29.aspx,我猜)在您感兴趣的套接字上。这样,WSASend
当此类套接字可以在不阻塞的情况下完成发送时将成功,否则将失败WSAGetLastError() == WSAEWOULDBLOCK
当缓冲区已满时(如的文档WSASend http://msdn.microsoft.com/en-us/library/windows/desktop/ms742203%28v=vs.85%29.aspx):
WSAEW区块
重叠套接字:有太多未完成的重叠 I/O 请求。非重叠套接字:套接字被标记为非阻塞,发送操作无法立即完成。
另请阅读关于此错误代码的进一步说明 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx#WSAEWOULDBLOCK.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)