由 小码哥发布于 2019-11-07 20:00:07 c++ posix sockets receive function

2023-12-11

我有一个可能很菜鸟的问题要问,我环顾四周,但没有看到解决这个问题的直接答案,我想我可能会在这里得到一个快速的答案。在使用 bsd 套接字的简单 TCP/IP 客户端-服务器选择循环中,如果客户端发送两条消息同时到达服务器,则在服务器上调用 recv 是否会返回捆绑在一起在缓冲区中的两条消息,或者 recv 是否强制每个消息不同的到达消息要单独读取吗?

我问这个问题是因为我在一个无法判断客户端如何构建要发送的消息的环境中工作。通常,recv 报告读取了 12 个字节,然后是 915,然后是 12 个字节,然后是 915,以此类推,以 12 到 915 的交替模式......但有时它会报告 927(即 915+12)。我在想,要么客户端在将其发送到服务器之前将其一些信息捆绑在一起,要么消息在调用recv之前到达,然后recv同时拉出所有待处理的字节。所以我想确保我正确理解recv 的行为。我想我的理解可能有一些遗漏,希望有人能指出,谢谢!


TCP/IP 是基于流的传输,而不是基于数据报的传输。在流中,之间不存在一对一的相关性send() and recv()。这仅适用于数据报。因此,您必须准备好处理多种可能性:

  1. 一次调用send()可以放入单个 TCP 数据包中,并通过一次调用即可完整读取recv().

  2. 一次调用send()可能跨越多个 TCP 数据包并需要多次调用recv()阅读一切。

  3. 多次调用send()可以放入单个 TCP 数据包中,并通过一次调用即可完整读取recv().

  4. 多次调用send()可能跨越多个 TCP 数据包并需要多次调用recv()对于每个数据包。

为了说明这一点,考虑正在发送两条消息 -send("hello", 5) and send("world", 5)。以下是调用时可能的几种组合recv():

"hello" "world"
"hel" "lo" "world"
"helloworld"
"hel" "lo" "worl" "d"
"he" "llow" "or" "ld"

明白了吗?这就是 TCP/IP 的工作原理。每个 TCP/IP 实现都必须考虑到这种碎片。

为了正确接收数据,逻辑消息之间必须有明确的分离,而不是单独的调用send(),因为可能需要多次调用send()发送一条消息,也可以发送多条消息recv()调用以接收完整的单个消息。因此,考虑到前面的示例,让我们在消息之间添加一个分隔符:

send("hello\n", 6);

send("world", 5);
send("\n", 1);

在接收端,您可以调用recv()需要多次,直到\n收到字符后,您将处理收到的导致该字符的所有内容。如果完成后还有剩余的读取数据,请保存以供以后处理并开始调用recv()再次直到下一个\n性格等等。

有时,不可能在消息之间放置唯一的字符(也许消息正文允许使用所有字符,因此没有可用作分隔符的不同字符)。在这种情况下,您需要在消息前面加上消息的长度前缀,可以是前面的整数、结构化标头等。然后您只需调用recv()根据需要多次,直到收到完整的整数/标头,然后调用recv()根据需要多次读取长度/标头指定的字节数。完成后,根据需要保存所有剩余数据,然后开始调用recv()再次读取下一个消息长度/标头,依此类推。

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

由 小码哥发布于 2019-11-07 20:00:07 c++ posix sockets receive function 的相关文章

随机推荐

  • 关于Struts2中的Action映射 - 没有映射Action

    我正在尝试运行我的 struts 应用程序 但收到错误操作未映射我已经看到名称空间是正确的 但仍然收到错误 struts xml
  • 响应式 2 列 CSS 布局,包括固定宽度的侧边栏?

    在任何地方都找不到这个问题的解决方案 我猜这一定是一个非常常见的问题 我正在创建一个带有侧边栏的响应式设计 其中侧边栏需要具有 200px 的固定宽度 并且高度未知 我怎样才能使主要内容区域占据所有剩余宽度 而不会出现任何异常行为 我最接近
  • 如果 scalatest 中的 FunSpec 的 afterEach 测试失败,如何确定

    在使用 FunSpec 的 scalatest 中 我有一些在 afterEach 中触发的代码 我想仅在测试失败时执行一些代码来获取屏幕截图 我所看到的几乎所有内容都试图通过将断言放入 try 块中来解决这个问题 这看起来很糟糕 Test
  • 如何等待回调函数返回?

    我正在使用phonegap 制作一个android 应用程序 我正在使用phonegap 的Storage api 来查询数据库 这是我的代码 function directPath src dest var db window openD
  • 自动调整文本输入框html大小

    我创建了一个输入 键入文本 框并使其自动调整大小非常简单 但是 有一些我似乎无法修复的故障 当我开始打字时 盒子缩小了一点 当我按退格键 或方向箭头 时 该框首先展开 然后在我继续键入时缩小 这是我的代码 function Expander
  • 反转生成的 vtable 函数顺序(具有相同名称的函数)

    如果使用 Visual Studio 2019 我使用两个具有相同名称但不同参数的虚拟方法来编译此 C 代码 struct MyStruct virtual void foo float 0 virtual void foo int 0 c
  • VBA中字符串的串联和最大长度,访问

    我在 access vba 中的字符串方面遇到了严重的问题 问题是 access 有时 将字符串的长度限制为大约 255 个字符 但是 根据字符串的构建方式 它可能会增长到超过 255 个字符 有一个工作代码的示例 Dim strReq a
  • 将父鼠标事件应用于子元素

    我正在制作小型 Windows 窗体应用程序 我里面有 PictureBox 父 和 Label 子 父元素的鼠标事件工作正常 但子元素生成的鼠标事件不会反映在父元素上 光标也会变回默认值 箭头 是否有可能pass由子控件生成的事件 例如M
  • 条件 SQL 计数

    创建计算表中数据出现次数的列的最佳方法是什么 表格需要按一列分组 我的数据库是 PostgreSQL 我见过 SELECT sum CASE WHEN question1 0 THEN 1 ELSE 0 END AS ZERO sum CA
  • Python 标准库,信号 :: AttributeError:模块“信号”没有属性“SIGALRM”

    我正在尝试设置函数超时 但是没有成功 我运行示例代码https docs python org 3 library signal html highlight signal 20sigalrm example 但是 我得到Attribute
  • Firebase Angular2 - 如何在没有太多开销的情况下查询和渲染列表

    在我的应用程序中 我有以下 firebase posts 结构 posts text meta user id user1 username 我正在使用 AngularFire2 因此 为了获取特定用户发布的所有帖子 我运行以下查询 thi
  • jQuery .html() 和里面的变量

    我想把变量FLC放在里面 FNC html 但不知道怎么做 有什么建议吗 DEMO var FLV random input box val FNC html
  • 非成员函数是否可以返回 const 值?

    如果是这样 怎么办 这个问题还有道理吗 就我而言 调用者修改返回的对象是没有意义的 因此我想将其标记为不可修改 const MyClass foo 是有效的 但返回 const 值没有意义 无论如何它都会被复制 您可以返回 例如常量引用 c
  • 循环在第一次后跳过 scanf 语句

    这是 main 的代码 int main void float acres 20 float bushels 20 float cost 0 float pricePerBushel 0 float totalAcres 0 char ch
  • WireMock 可以回放来自多个域的请求吗?

    我正在构建一个 Docker 化的记录播放系统来帮助我记录网站 这样我就可以根据本地版本而不是真实版本来设计抓取工具 这意味着我不会用自动请求淹没网站 并且具有不需要连接到网络即可工作的额外优势 我在内部使用了基于 Java 的 WireM
  • 应用程序和控制器类之间的 JavaFX FXML 通信

    我试图获取并销毁我在 FXML 应用程序关闭中通过 ProcessBuilder 创建的外部进程 但它不起作用 这是基于有用的建议谢尔盖 格里涅夫给了我这里 我尝试过使用 不使用 myController setApp this 来运行并使
  • 安全沙箱违规:缺乏策略文件权限

    我正在使用 as3httpclientlib 将数据发布到我的网络服务 但我不断 遇到以下安全违规 有谁知道如何解决这个问题 我的 crossdomain xml 文件位于安全违规通知下方 NOTE 我使用 apache 来代理对 Web
  • 如何在全局范围内初始化结构/类

    我现在知道如何在全局范围内初始化结构 以下是示例代码 include
  • 如何在asp.net中的GridView的按钮上添加事件

    我在 asp net 中有一个搜索页面 用户搜索一本书 结果列在网格视图中 我在每个 gridview 结果列的右侧添加了一个按钮 我想向这些按钮添加一个事件 例如 当用户单击该按钮时 该书被借出 这是它的屏幕截图 这是我的代码
  • 由 小码哥发布于 2019-11-07 20:00:07 c++ posix sockets receive function

    我有一个可能很菜鸟的问题要问 我环顾四周 但没有看到解决这个问题的直接答案 我想我可能会在这里得到一个快速的答案 在使用 bsd 套接字的简单 TCP IP 客户端 服务器选择循环中 如果客户端发送两条消息同时到达服务器 则在服务器上调用