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

标签 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 个字节(或 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/

相关文章:

php - 使用来自 mysql 的元键获取元值

networking - 使用winsock扫描局域网游戏服务器

Android:使用电子邮件 Intent 发送电子邮件,可以在发送前更改消息吗?

php - SELECT Distinct FROM 两个表。 MySQL

MySQL 选择不同的问题

vb6 - 您如何知道已向 Web 服务器发出 POST 或 GET 的 Winsock 控件何时接收到所有数据?

sockets - 从IE,Firefox和/或Chrome浏览器查看/监视TCP/IP套接字的最佳方法?

c++ - 定时发送报文堆叠

Java,如何在java中的方法之间发送数组?

MySQL:在日期 dd.mm.yyyy hh.mm.ss 之间选择