- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通过 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。
最佳答案
According to MVP Alexander Nickolov ,Windows中没有这样的功能。他还提到“良好的套接字代码”不使用类似 FIONWRITE 的 ioctl,但没有解释原因。
要避免此问题,您可以在您感兴趣的套接字上启用非阻塞 I/O(我猜是使用 FIONBIO
)。这样,WSASend
将在此类套接字上成功当它可以在不阻塞的情况下完成发送时,或者当缓冲区已满时失败并显示 WSAGetLastError() == WSAEWOULDBLOCK
(如 documentation for WSASend
中所述):
WSAEWOULDBLOCK
Overlapped sockets: There are too many outstanding overlapped I/O requests. Nonoverlapped sockets: The socket is marked as nonblocking and the send operation cannot be completed immediately.
关于select - 确定用winsock(FIONWRITE)可以发送多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12858259/
通过 select,我可以确定是否可以在不阻塞的情况下接收或发送任何字节。 通过这个函数,我可以确定可以接收多少字节: function BytesAvailable(S: TSocket): Int
我是一名优秀的程序员,十分优秀!