非阻塞 TCP 套接字并在发送后立即刷新?

2024-02-20

我正在为我的应用程序使用 Windows 套接字(winsock2.h)。由于阻塞套接字不允许我控制连接超时,因此我使用非阻塞套接字。发送命令后,我正在使用关闭命令来刷新(我必须这样做)。我的超时是50ms,我想知道如果要发送的数据这么大,是否有只发送部分数据或根本不发送数据的风险?提前致谢...

    hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    u_long iMode=1;
    ioctlsocket(hSocket,FIONBIO,&iMode);
    connect(hSocket, (sockaddr*)(&sockAddr),sockAddrSize);
    send(hSocket, sendbuf, sendlen, 0);
    shutdown(hSocket, SD_BOTH);
    Sleep(50);
    closesocket(hSocket);

非阻塞 TCP 套接字并在发送后立即刷新?

不存在刷新 TCP 套接字这样的事情。

由于阻塞套接字不允许我控制连接超时

错误的。您可以使用select()在阻塞套接字上。

我正在使用非阻塞的。

不合逻辑的推论。

发送命令后,我正在使用关闭命令来刷新(我必须这样做)。

你不必这样做,而且shutdown()不冲洗任何东西。

我的超时是50ms

为什么?发送数据的时间取决于数据的大小。明显地。使用固定的发送超时没有任何意义。

我想知道的是,如果要发送的数据这么大,是否存在只发送部分数据或根本不发送数据的风险?

在阻止模式下,您提供给的所有数据send()如果可能的话将被发送。非阻塞模式下,返回值代表的数据量send()如果可能的话,将被发送。无论哪种情况,如果发送失败,连接都会重置。无论您叠加什么超时机制都不可能改变其中任何一个:具体来说,超时后异步关闭套接字只会导致将关闭附加到正在发送的数据中。它会not导致发送中止。

您的代码不会通过人类已知的任何代码审查。零错误检查;睡眠完全没有意义;并且在关闭之前关闭是多余的。如果睡眠旨在实现超时,则它不会。

我想尽快发送数据。

你不能。 TCP实现流量控制。你对此无能为力。您受到接收者的速率限制。

另外两种可能的情况是:服务器等待太长时间接受连接

没有这样的案例。客户端可以在服务器调用之前完成连接accept().如果您尝试实现比默认值约一分钟更短的连接超时,请使用select().

或接收。

你对此无能为力:见上文。

因此,连接和写入都应该在最多 50 毫秒内完成,因为时间在我的情况下非常重要。

往上看。对于需要可变时间的操作实现固定超时是没有意义的。 50 毫秒对于连接超时来说太短了。如果这是一个真正的问题,您应该保持连接打开,以便连接延迟只发生一次:事实上,您应该尽可能长时间地保持 TCP 连接打开。

我必须刷新写入和读取流

你不能。 TCP 中没有任何操作会刷新读取流或写入流。

因为服务器不断向我发送不必要的大数据,而且我的互联网连接有限。

Another 不合逻辑的推论。如果服务器向您发送数据,您必须读取它,否则您将停止服务器,并且这与刷新您自己的写入流没有任何关系。

实际上我什至不想要来自服务器的单个字节

厄运。你必须阅读它。 [如果您使用的是 BSD Unix,您可以关闭输入套接字,这将导致来自服务器的数据被丢弃,但这在 Windows 上不起作用:它会导致服务器连接重置。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非阻塞 TCP 套接字并在发送后立即刷新? 的相关文章

随机推荐

  • 从其他类访问 IBOutlet

    我有一个基于文档的可可应用程序 应用程序菜单中的一个项目连接到IBAction 单击该项目需要执行一项使用IBOutlet在使用另一个类的主 nib 文件中 MyDocument 创建同一类的 2 个对象 每个笔尖一个对象似乎不起作用 我如
  • Python:如何使用plotly制作阴影区域或交替背景颜色?

    仅使用这几行代码plot ly https plot ly python offline plotting offline with cufflinks将在 jupyter 笔记本中为您提供以下绘图 片段 1 import plotly i
  • 如何修复“java.sql.SQLException:无法添加外键约束。”创建具有双主外键关系的表时

    我正在使用 Kotlin 和 Jetbrain 的公开 SQL 库为我正在开发的项目设置数据库 我正在尝试在两个表cw cache 父表 和cw requests 子表 之间建立外键关系 此设置适用于 Sqlite 数据库 但当我尝试在 M
  • AWS SDK无法读取环境变量

    我正在为 Jenkins 设置 AWS env 变量 如下所示 sudo apt get update y sudo apt get install y python3 python pip python devel sudo pip in
  • Yeoman,如何引用凉亭包(字体很棒)?

    我对 Yeoman 完全陌生 我遇到了一个问题 设置项目后 我决定使用 font awesome 所以我使用 Bower 安装了它并且工作正常 问题是 font awesome 不在 dist bower components 文件夹中 但
  • 如何使用.NET在Windows窗体中显示Windows文件夹内容?

    我想在我的 Windows 窗体中显示文件夹内容 用户可以从其中复制粘贴用户所需的文件 为此我必须使用什么类型的容器 基本上你有两个选择 您可以获得一个已经构建的控件并在您的应用程序中使用它 它们有很多 但不是很好 您必须付费购买一个 或者
  • 带点火花的列名​​称

    我正在尝试从DataFrame并将其转换为RDD Vector 问题是我的列名称中带有 点 如下数据集 col0 1 col1 2 col2 3 col3 4 1 2 3 4 10 12 15 3 1 12 10 5 这就是我正在做的 va
  • Angular 6 的 Primeng 验证码问题

    我在用primeng验证码 https www primefaces org primeng captcha对于 Angular 6 我有一个问题 当我尝试直接加载具有验证码确认的页面时 出现此错误 错误类型错误 window grecap
  • 如何从 awk 中的 split 函数访问数组的最后一个索引?

    我如何使用 awk 来做到这一点 例子 awk split 1 A print A 1 1 2 3 4 输入和输出示例 Input 123 456 abc def ghi 789 321 654 qaz wsx edc rfv 987 Ou
  • 如何设置AllowOverride all

    我想设置AllowOverride all但我不知道该怎么做 我通过谷歌搜索找到了以下代码并将其粘贴到 htaccess
  • 上的 XSS 数据 URI 是否可被利用?

    读完这篇文章后 我没有一个明确的答案 http palizine plynt com issues 2010Oct bypass xss filters http palizine plynt com issues 2010Oct bypa
  • 使用 lodash 动态计算嵌套集合的平均值

    我有一个 JSON 对象数组 集合 例如 x x1 1 y yt 0 zt 4 qa 3 ft 0 x x1 5 y yt 10 zt 2 qa 0 ft 0 我想计算每个字段的平均值 结果结构应该相同 喜欢 x x1 3 y yt 5 z
  • 使用 NSIndexPath 作为 NSMutableDictionary 中的键时出现问题?

    尝试在中存储和检索值是否有任何特殊原因NSMutableDictionary使用一个NSIndexPath as a key可能会失败 我最初尝试这样做是为了存储NSMutableDictionary of UITableViewCell高
  • 如何使用 getElementsByName 循环表单中的元素?

    我想按名称选择表单中的某些元素 因此我想使用 getElementsByName name 然后我想为这些元素添加一个值 我该如何做这个循环 boxesEL document getElementsByName boxesName for
  • Silverlight HttpWebRequest.Create 挂在异步块内

    我正在尝试构建从 Silverlight 4 到 JBOSS Web 服务器的 Rpc 调用原型 我已经编写了代码 并且它正在控制台应用程序中运行 所以我知道 Jboss 正在响应 Web 请求 将其移植到 silverlight 4 会引
  • Windows 相当于 OS X 钥匙串?

    Windows 中是否有相当于 OS X 钥匙串的东西 用于存储用户密码 我会用它来保存我的 桌面 软件使用的 Web 服务的用户密码 从这个相关问题的答案 保护桌面应用程序中的用户密码 修订版 2 https stackoverflow
  • 如何在R中通过主向量绘制维恩图子集

    假设我有一个像这样的数据框 df lt data frame A rep 1 10 B c 1 1 1 1 1 1 1 1 0 0 C c 0 0 0 1 1 1 1 1 1 1 D c 0 1 1 1 1 1 1 1 1 0 df A B
  • 在构建机器上构建 WSP 文件

    在我的开发机器上我安装了VSWSS 1 3并配置了本地 IIS 6 以便我可以build我的 SharePoint 项目和deploy the 生成的WSP文件到本地机器 WSP文件是由打包步骤生成的 我可以在其他机器上成功安装 现在我必须
  • laravel 视图中的 e() 方法有什么用?

    我正在深入研究 laravel 了解了刀片视图是如何解释的 我发现的是 This tenant gt name 翻译成这样 我不明白什么是e 方法是为了 我在 php net 上也找不到它 所以我猜测它是 laravel 5 本身的一部分
  • 非阻塞 TCP 套接字并在发送后立即刷新?

    我正在为我的应用程序使用 Windows 套接字 winsock2 h 由于阻塞套接字不允许我控制连接超时 因此我使用非阻塞套接字 发送命令后 我正在使用关闭命令来刷新 我必须这样做 我的超时是50ms 我想知道如果要发送的数据这么大 是否