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

2024-04-28

通过 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(使用前将#替换为@)

确定用winsock(FIONWRITE)可以发送多少字节? 的相关文章

  • Spring AMQP RabbitMQ 如何直接发送到Queue而不需要Exchange

    我正在使用 Spring AMQP 和 Rabbitmq 模板 如何直接将消息发送到队列而不使用Exchange 我该怎么做 我该怎么做 你不能 发布者不知道队列 只是交换和路由密钥 但是 所有队列都绑定到默认交换器 以队列名称作为其路由键
  • 在今天和昨天之间选择

    我正在尝试在两个日期之间进行选择 如下所示 SELECT p Code p Name sum h PA 1 AS PA sum h PB 1 AS PB sum h PG 1 AS PG sum h GoedkeuringDoorNew G
  • SQL Server 的 SELECT JOIN 语句导致的死锁

    当执行带有两个表的 JOIN 的 SELECT 语句时 SQL Server 似乎 分别锁定语句的两个表 例如通过像这样的查询 这 SELECT FROM table1 LEFT JOIN table2 ON table1 id table
  • 如何通过MailChimp 3.0 api发送电子邮件?

    我正在尝试通过 php 中的 mailchimp api 版本 3 0 发送电子邮件 但我没有运气 这是我的代码 postString message html this is the emails html content text th
  • 跳出选择循环?

    我正在尝试使用select在循环中接收消息或超时信号 如果收到超时信号 则循环应中止 package main import fmt time func main done time After 1 time Millisecond num
  • 将一项选择中的两项计数相除

    我有一个这样的表 date timestamp Error integer someOtherColumns 我有一个查询来选择特定日期的所有行 SELECT from table WHERE date date 2010 01 17 现在
  • 如何根据多个字段选择不同的行

    我有一个表 其中包含 MSSQL 数据库中一系列事件的数据 ID Name Date Location Owner 1 Seminar Name 1 2013 08 08 A Location Name
  • with(nolock) 或 (nolock) - 有区别吗?

    一切都基于 with nolock 完全适合这种情况的假设 已经有很多问题在争论是否使用 with nolock 我环顾四周 无法找到使用之间是否存在实际差异with nolock select customer zipcode from
  • 如何在选择查询中创建新列

    在 MS Access 中 我想将新列插入到选择查询的返回结果中 新列的每一行都具有相同的值 例如 我的选择返回列 A B 我希望 C 成为选择查询创建的新列 A B C a1 b1 c a2 b2 c a3 b3 c select A B
  • jQuery,选择具有属性的最近兄弟(下一个或上一个)

    我有一个类似于下面标记的选择下拉列表
  • 套接字通信中send()和recv()的行为

    以下是设置 Server Client accept connect v send msg1 gt v v recv lt send v v send msg2 gt recv v v close 这是我的问题 1 客户端在关闭之前其实就收
  • Python Socket - 同时发送/接收消息

    基本上我一直在使用套接字和线程开发一个简单的聊天室 在我的客户端中 我可以接收和发送消息 我的问题是循环中一个消息先于另一个消息 所以如果我发送消息 我只会在发送消息后收到数据 我希望它像任何其他聊天室一样工作 当我发送消息时我可以收到消息
  • 熊猫选择倒数第二列,这也不是 nan

    我已尽可能多地清理数据并在 Pandas 数据框中读取它们 所以问题是不同的文件有不同的列数 但它总是倒数第二个非纳米列是我想要的 那么有什么办法可以把它们挑出来吗 这是数据的示例 f g h l 0 39994 29 568 29 569
  • 轨道:fields_for选择

    在我的视图中 我使用 fields for 来显示关系表的表单数据 然而 此表格的一部分将有可供选择的选择列表 我看到 form for 和 fields for 帮助程序有 label text field text area 帮助程序
  • facebook 发送 API 错误代码:100 API 错误描述:无效参数错误消息:“链接”无效

    我正在使用 facebook post GRAPH UI 来发布私人消息 并链接到我在 facebook 中的应用程序 早些时候它工作正常 但从最近两天开始 对话框开始抛出错误 发生错误 请稍后再试 API错误代码 100API错误描述 无
  • 如果通过 SQL 查询结果没有找到记录,则应为 0

    我正在使用火鸟 我需要以下结果 但我没有得到我需要的结果 我尝试了以下查询 SELECT CASE EXTRACT MONTH FROM pd Date WHEN 1 THEN January WHEN 2 THEN February WH
  • SQL select通常是如何实现的

    我有两节课 class PopulationMember public void operationOnThisMember1 void operationOnThisMember2 private Population populalti
  • 根据 TCP 的 C++ 函数

    我正在使用 recv 函数 C 来获取有关网络问题的指示 在这种情况下它返回负值 看这里 https www rfc editor org rfc rfc1122 page 100 https www rfc editor org rfc
  • 当Where子句中的术语不在数据库中时,如何从MySQL数据库返回0?

    如果 WHERE 子句中的邻域不存在 如何让 mysql 数据库返回 0 因此 在下面的示例中 旧城区不在数据库中 我希望数据库返回 0 个事件而不是空结果 SELECT incidents neighborhoods FROM myTab
  • 如何将 OpenSSL 与 WinSock 一起使用?

    我在网上搜索过 但没有找到任何与此相关的内容 有谁有使用 WinSock 和 OpenSSL 的简单代码示例吗 我正在寻找一个简单的 Visual C 2005 或更高版本的代码示例 它创建并打开一个 Winsock 连接 并使用 Open

随机推荐