非阻塞 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 套接字并在发送后立即刷新? 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 从其他类访问 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 我想知道如果要发送的数据这么大 是否