gpt4 book ai didi

select - 确定用winsock(FIONWRITE)可以发送多少字节?

转载 作者:行者123 更新时间:2023-12-02 11:40:50 24 4
gpt4 key购买 nike

通过 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.

另请阅读further notes about this error code .

关于select - 确定用winsock(FIONWRITE)可以发送多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12858259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com