如何要求套接字等待更多数据到来

2023-12-12

我正在玩保留CLI项目,它是一个与统计环境 R 通信的 .net 客户端。基本思想是通过 TCP 协议在此 .NET 客户端和 R 会话之间发送数据/命令。

我和其他人发现的一个错误是大数据主干,比如超过 10k 字节,无法成功传输。我在下面的代码片段中找到了但是:

        // send the commend to R, then R will do some computation and get the data ready to send back
        int toConsume = this.SubmitCommand(cmd, data); 
        var res = new List<object>();
        while (toConsume > 0)
        {
            var dhbuf = new byte[4];
            if (this.socket.Receive(dhbuf) != 4)
            {
                throw new WebException("Didn't receive a header.");
            }

            byte typ = dhbuf[0];

            // ReSharper disable RedundantCast
            int dlength = dhbuf[1] + (((int)dhbuf[2]) << 8) + (((int)dhbuf[3]) << 16);

            // ReSharper restore RedundantCast
            var dvbuf = new byte[dlength];

            // BUG: I added this sleep line, without this line, bug occures
            System.Threading.Thread.Sleep(500);

            // this line cannot receive the whole data at once
            var received = this.socket.Receive(dvbuf);
            // so the exception throws 
            if (received != dvbuf.Length)
            {
                var tempR = this.socket.Receive(dvbuf);
                throw new WebException("Expected " + dvbuf.Length + " bytes of data, but received " + received + ".");
            }

原因是.NET代码运行速度太快,R端无法那么快地发送数据。因此,我插入 Thread.Sleep(500) 之后的接收行没有获取所有数据。如果我在那里等待一段时间,那么它就可以获得所有数据。但我不知道要多久。

我有一些基本的想法来处理这个问题,例如,不断使用 this.socket.Receive() 来获取数据,但是如果那里没有数据 .Receive 就会阻塞在那里。

我对套接字编程经验很少,所以我询问此类问题的最佳实践。谢谢!


根据docs:

如果您使用面向连接的 Socket,则 Receive 方法将读取尽可能多的可用数据,最多可达缓冲区的大小。

因此,您永远无法保证获得接收呼叫中所需的所有数据。您需要检查 Receive 实际返回了多少字节,然后对剩余字节发出另一个接收调用。继续该循环,直到获得所需的所有字节。

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

如何要求套接字等待更多数据到来 的相关文章

  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 将数据框中重叠的范围合并到唯一的组中

    我有一个 n 行 3 的数据框 df lt data frame start c 178 400 983 1932 33653 end c 5025 5025 5535 6918 38197 group c 1 1 2 2 3 df sta
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 4个字节怎么能存储这么大的值3.4e38

    与 32 位一样 我们只能存储 2 32 位数据 在C语言中 我们如何存储这么大的值3 4e38 我无法理解其背后的机制 在 IEEE 754 32 位二进制浮点格式中 32 位用作 一位符号字段 s 八位指数字段 e 23 位有效数 小数
  • 从2加入多线程访问UI线程控件

    我目前正在为我的公司开发一个小型自动更新项目 经过对多线程的一些研究后 我设法构建了以下代码 线程 01 Private Sub startUpdate If InvokeRequired Then Invoke New FTPDelega
  • 当用户单击上下文菜单中的禁用项目时,会调用哪个事件?

    我有一个按钮 它显示上下文菜单 菜单中有几个项目 其中一些被禁用 setEnabled false 当用户单击禁用的项目时 会调用哪个事件 它不是 onContextItemSelected 也不是 onContextMenuClosed
  • sizeof 运算符给出了 C# 中结构的额外大小[重复]

    这个问题在这里已经有答案了 我正在尝试使用 sizeof 运算符检查所有变量 值类型 的大小 我经历了其中之一msdn 文章哪里写着 对于所有其他类型 包括结构体 sizeof 运算符只能在不安全的代码块中使用 而且结构不应包含任何引用类型
  • 检查 JPanel 是否包含 JButton

    我已经添加了一个按钮JPanel 我想删除该按钮 如果JPanel包含按钮 有什么办法可以检查是否JPanel包含按钮 如果您有参考JButton call 获取父级 如果父母是null 按钮不在面板 或任何容器 中 或者 按照 kleop
  • 如何在 Nodejs 循环中将值收集到数组中?

    我编写了下面的代码 尝试将视频收集到数组中然后返回 代码是错误的 但我无法找出正确的方法来做到这一点 var redis require redis var client redis createClient app get topvide
  • VS Code:jupyter笔记本逐行运行

    最近 VSCode 进行了更新 之后我的 jupyter 笔记本界面发生了变化 这给我带来了很多问题 现在我不知道如何逐行运行单元格代码等 还有其他方法可以做到这一点吗 或者我怎样才能恢复到旧版本的笔记本电脑 打开命令面板 Windows
  • 从conftest.py访问测试文件名

    我正在尝试做什么 我正在使用 pytest 在 python 中编写一个小框架 作为拆卸的一部分 我正在截取屏幕截图 现在 我希望根据正在运行的测试来命名该屏幕截图 而不是 conftest py 例如 我现在的代码是 driver sav
  • 如何根据另一个字段中的值设置 SharePoint 列表字段中的默认值?

    我在 SharePoint 中有一个自定义列表 特别是 MOSS 2007 其中一个字段是标题为 有缺陷吗 的是 否复选框 另一个字段是 关闭者 指定关闭票证的人 如果没有缺陷 那么我希望票证自动关闭 如果有 则应稍后填写 关闭者 字段 我
  • Typescript :: 相关通用约束

    In React 我有一个像这样的通用界面 interface BaseProps
  • 解析 HTML 文本时的正则表达式与 XPath

    我想解析 HTML 文本并找到特殊部分 例如第 3 行中的文本div of 1st row和第二个column of a table 我有 2 个解析选项 正则表达式和 XPath 每一种的优点和缺点是什么 thanks 这在某种程度上取决
  • 获取运行脚本的父目录

    在 PHP 中 最简洁的方法是什么 parent当前运行脚本相对于 www 根目录的目录 假设我有 SERVER SCRIPT NAME relative path to script index php Or just something
  • 绝对位置是否使该元素成为包含块?

    在css2 1规范中 w3 org 有一个例子解释了包含块是如何形成的 p This is text em in the strong second strong paragraph em p 当位置em作为静态 strong的包含块是通过
  • 窗口大小更改时调整标题大小

    我目前正在开发一个网站 我需要在其中放置一些图像以及一些标题和描述 如果浏览器是全屏 则标题显示在一行上 但是 如果浏览器宽度减小 标题会自动显示为两行 这是浏览器全屏时的样子 这是当浏览器宽度减小时的样子 我想让它在浏览器宽度减小时减小标
  • 如何用C++模拟鼠标点击? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我需要模拟单击应用程序窗口的鼠标单击 我正在使用 Windows 如何将鼠标左键单击发送到屏幕x y窗口所在的坐标 Use the 发送输入 功能 INPUT Inputs 3 0 I
  • 带 IdHTTP 的 POST 请求

    您好 我正在尝试使用组件 IdHTTP POST 方法填写表单 我的代码是这样的 var par2 TIdMultiPartFormDataStream rta string begin par2 TIdMultiPartFormDataS
  • GAE:此应用程序不允许 API 服务

    我正在尝试按照以下教程进行操作 http www youtube com watch v v9TG7OzsZqQ 我的 Cloud Endpoint REST API 在本地开发计算机上运行良好 但当我部署到 App Engine 时 我的
  • 调用另一个合约中的函数 - Solidity

    我需要使用 Truffle 调用另一个合约中的函数 这是我的合同样本 类别 sol contract Category notice Check if category exists function isCategoryExists ui
  • C# 按列按字母顺序对列表进行排序

    我定义了一个类 并将该类的记录写入列表中 在编写错误报告之前无法对列表进行排序 我试图在写入错误报告之前按 finderror 类型按字母顺序对列表进行排序 以便在错误报告中对列表进行排序并更有条理 这是课程 public class ty
  • 如何要求套接字等待更多数据到来

    我正在玩保留CLI项目 它是一个与统计环境 R 通信的 net 客户端 基本思想是通过 TCP 协议在此 NET 客户端和 R 会话之间发送数据 命令 我和其他人发现的一个错误是大数据主干 比如超过 10k 字节 无法成功传输 我在下面的代