如果接收到有效负载大小为 0 的有效 TCP 数据包,recv() 将返回什么值

2023-11-21

在TCP套接字编程中,如果recv()返回0,表示对方关闭了连接。然而,据我所知,TCP RFC 并不强制要求 TCP 的有效负载 > 0。因此,理论上,TCP 堆栈可以接收有效负载为 0 的消息。

所以,本质上我的问题是recv()如果接收到有效负载大小为 0 的数据包,则返回?如果返回0,那么我们如何区分它和关闭连接指示。


有效负载大小为 0 的 TCP 段无处不在 - 它们几乎出现在每个现实世界的 TCP 流中。每当一方希望确认收到另一方的数据但没有自己的数据可发送时,就会发送它们。 (这些通常称为“ACK 数据包”,但“ACK 数据包”只是一个恰好不包含数据的常规段)。

由于此类数据包不包含任何要传递给用户应用程序的数据,因此它们不会导致recv()回来 -recv()将继续阻塞,直到一些实际数据到达。如果recv()返回 0,则明确指示另一端已关闭其一侧的连接,并且不会再发送任何数据。

请记住 TCP 是面向流的:有not单个返回的数据之间的 1 对 1 映射recv()调用和单个 TCP 段中的数据。单个recv()调用可能会返回一个与多个 TCP 段重叠的数据块,并且单个 TCP 段中的数据可能会在多个 TCP 段中返回recv()来电。 TCP 段之间的边界对于使用 BSD 套接字 API 的应用程序来说是不可见的。如果您想要这样的边界,您需要使用 TCP 流中的应用程序层协议自行实现,或者使用面向数据报的协议(如 UDP)。

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

如果接收到有效负载大小为 0 的有效 TCP 数据包,recv() 将返回什么值 的相关文章

  • 如何在.NET中创建HTTP请求侦听器Windows服务

    我想创建充当 HTTP 侦听器并可以处理大约 500 个客户端的 Windows 服务 这种服务有什么特别的考虑吗 我对 HTTPListener 类和 TCPListener 类有点困惑 将哪一个用于 Windows 服务将 接受客户端连
  • 不调用bind()的情况下监听()

    我尝试了以下方法 int sockfd socket listen sockfd 10 accept sockfd 没有一个调用失败 并且程序开始阻塞 就像我调用了bind 一样 在这种情况下会发生什么 由于没有本地地址或端口 是否永远无法
  • Spring Integration TCP - 在发送数据之前启动消息握手

    我正在使用 MessagingGateway 将数据发送到服务器 我为出站网关配置了 AbstractClientConnectionFactory 和 ServiceActivator 为了将数据发送到我的服务器 我需要在启动连接时发送握
  • WebSocket 和纯 TCP 之间的根本区别是什么?

    我读过关于WebSockets http en wikipedia org wiki Web Sockets我想知道为什么浏览器不能像任何其他桌面应用程序一样简单地打开简单的 TCP 连接并与服务器通信 为什么可以通过 websocket
  • 用 C 处理 TCP 的部分返回

    我一直在读Beej 的网络编程指南 http beej us guide bgnet 获取 TCP 连接的句柄 在其中一个示例中 简单 TCP 流客户端的客户端代码如下所示 if numbytes recv sockfd buf MAXDA
  • Python。从 6 字节字符串中打印 mac 地址

    我有 6 字节字符串的 mac 地址 您将如何以 人类 可读的格式打印它 Thanks import struct x x x x x x struct unpack BBBBBB your variable with mac
  • 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

    因此 作为我的项目 2D 多人纸牌游戏 的一部分 我已经弄清楚如何在线托管和运行服务器脚本 我的计划是让两个单独的 kivy 客户端连接到服务器 这只是一个带有命令的脚本 但是我对操作顺序有些困惑 因为我think客户端连接可能与消息循环发
  • Node.js 找不到模块“tcp”

    节点在以下行崩溃 var tcp require tcp 错误文本 node js 201 throw e process nextTick error or error event on first tick Error Cannot f
  • 我的代码中某处存在无限循环

    我有这个 Java 游戏服务器 最多可处理 3 000 个 tcp 连接 每个玩家或每个 tcp 连接都有自己的线程 每个线程的运行情况如下 public void run try String packet char charCur ne
  • TCP 兼容性:为什么 TCP 不兼容数据包广播和组播操作?

    http en wikipedia org wiki User Datagram Protocol http en wikipedia org wiki User Datagram Protocol 与 TCP 不同 UDP 与数据包广播
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • Python Socket - 同时发送/接收消息

    基本上我一直在使用套接字和线程开发一个简单的聊天室 在我的客户端中 我可以接收和发送消息 我的问题是循环中一个消息先于另一个消息 所以如果我发送消息 我只会在发送消息后收到数据 我希望它像任何其他聊天室一样工作 当我发送消息时我可以收到消息
  • PHP 上的多个 TCP 套接字请求

    是否可以使用 PHP 上的套接字服务器接受多个请求 并行 如果可以的话 怎样做 普通的 PHP 脚本无法接收多个请求 但如果你真的计划创建一个套接字服务器 作为 cmdline php 脚本启动 那么是的 这是可能的 调查http pear
  • 是否可以通过互联网在两个移动设备 (iPhone) 之间连接套接字?

    是否可以通过互联网在两个移动设备 iPhone 之间连接套接字 我正在尝试发现每个设备的IP并直接连接 我知道可以使用 Bonjour 来完成 但这只适用于本地网络 我需要通过互联网在两个设备之间建立高速连接 Thanks 如果你有两个 I
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如
  • 发起TCP连接关闭后如何接收数据?

    TCP 允许一侧发出 FIN 并让另一侧在结束其一侧的连接之前响应一些数据 我如何使用 NET 来实现这一点TcpClient 看来我必须使用Close发出FIN 但之后我不能再打电话Client Receive since Client被
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 无法分配请求的地址 - 可能的原因?

    我有一个由主服务器和分布式从服务器组成的程序 从属服务器向服务器发送状态更新 如果服务器在固定时间内没有收到特定从属服务器的消息 则会将该从属服务器标记为关闭 这种情况一直在发生 通过检查日志 我发现从站只能向服务器发送一个状态更新 然后永

随机推荐

  • 如何检查 PHP 中的关闭函数中的退出是否干净?

    如何测试 PHP 中的关闭函数中的 exit 是否干净 通过干净退出我的意思是脚本没有由于错误而终止 这是一个很好的问题 目前我只有这个想法 注册一个关闭函数 如下所示 function shutdown if defined END RE
  • 随着时间的推移,Python 进程内存不断增加

    我的 python 代码进程内存动态增加 因为它在必要时将动态数据存储在列表 字典和元组中 尽管此后所有这些动态数据在其变量中都被物理清除 但内存并没有崩溃 因此 我觉得存在内存泄漏 我使用 gc collect 方法来收集所有未释放的内存
  • 在单独的线程中更新 ObservableCollection

    在 WPF 应用程序中 ObservableCollection 由 LINQ to SQL 查询填充和更新 然后使用此 ObservableCollection 中的值更新 UI 对象 通过 LINQ to SQL 查询更新此 Obser
  • 为什么在 printf 中使用指针时会强制转换为 (void*)p? [复制]

    这个问题在这里已经有答案了 char x G char p x printf Address of x p n p printf Address of x p n void p 有人能告诉我到底是什么吗 void p方法 我知道它是一样的p
  • 处理 stdio 文件写入函数的返回值的良好编程模式是什么

    我正在编写一些生成大量代码的代码 ignoring return value of size t fwrite const void size t size t FILE declared with attribute warn unuse
  • clang 相当于 -rdynamic gcc 标志是什么?

    我找不到任何类似的选项可以将所有函数名称包含到最终版本的二进制文件中 或者确实clang默认执行吗 这个问题的正确答案是 Wl export dynamic and not Wl export dynamic Wl export dynam
  • Pandas 性能:pivot_table 与 groupby

    我正在努力解决pivot table versus groupby 一方面我有 time df groupby INDEX COLUMN agg VALUE sum size unstack level COLUMN CPU times u
  • C#:小数与浮点相乘?

    我想执行以下操作 小数 小数 浮动 100 做到这一点最有效的方法是什么 你想要的结果是float var result float d f 100 或作为小数 var result d decimal f 100 我当然质疑混合decim
  • Rails 不会加载资产管道

    I ran rake assets precompile由于开发过程中的错误 Rails 停止加载开发过程中的资源 我只得到application js and application css loaded 应用程序 js require
  • Wiremock 独立 - 如何使用请求数据操作响应

    我试图使用 Wiremock 独立服务器来实现 POST REST 调用的模拟 我面临这样的挑战 假设帖子正文包含 名称 字段及其值 则该 POST 调用的响应中应返回相同的值 我的 json 文件如下所示 priority 1 reque
  • 将字符串转换为类

    我试图根据一些用户输入在一个活动之间移动到另一个活动 我正在尝试使用 String myClass some user input class Intent myIntent new Intent getApplicationContext
  • Java 服务器 JavaScript 客户端 WebSocket

    我正在尝试在 Java 服务器和 JavaScript 客户端之间建立连接 但我在客户端收到此错误 与 ws 127 0 0 1 4444 的 WebSocket 连接失败 连接在收到握手响应之前关闭 它可能会保持在 OPENNING 状态
  • Android TTS 中缺少语言

    我正在开发一个使用谷歌提供的 TextToSpeech 功能的 Android 应用程序 并遵循以下示例 来自 Google 的 TTS 示例 我想知道这一行 int result mTts setLanguage Locale US if
  • 为什么 range(start, end) 不包括 end? [复制]

    这个问题在这里已经有答案了 gt gt gt range 1 11 给你 1 2 3 4 5 6 7 8 9 10 为什么不是1 11 他们只是决定随机这样做还是有一些我没有看到的价值 因为更常见的是打电话range 0 10 返回 0 1
  • 如何从打字稿中的类型中省略 [key:string]: any ? [复制]

    这个问题在这里已经有答案了 说我有 interface A apple number key string any interface B extends A banana number 我想要一个type C延伸所有自A以及所有来自B e
  • random.shuffle() 的逆函数?

    我有一个函数 为了简单起见 我将其称为 shuffler 它需要一个列表 随机给出种子 17 然后打印该列表 def shuffler n import random random seed 17 print random shuffle
  • 重置提供商数据 - Flutter

    我在我的应用程序中使用多提供商 Provider 工作得很好 它存储数据 并且在任何事情发生变化时提供完美的事件 现在 我的应用程序中有这个场景 gt 用户 1 已登录 现在 当我在同一登录中添加第二个帐户 例如 Gmail 多帐户 时 提
  • Java 记录器 - 令牌的撇号问题

    我有一些无法解释的行为java util logging 让我们看一下这两个示例 First boolean var false log log Level WARNING Cant 0 new Object var output Cant
  • 如何将 int 转换为十六进制字符串?

    我想将一个整数 例如 我想通过65然后出去 x41 or 255并得到 xff 我尝试过这样做struct pack c 65 但是上面的任何东西都会窒息9因为它想要接受单个字符串 您正在寻找chr功能 您似乎混合了整数的十进制表示形式和整
  • 如果接收到有效负载大小为 0 的有效 TCP 数据包,recv() 将返回什么值

    在TCP套接字编程中 如果recv 返回0 表示对方关闭了连接 然而 据我所知 TCP RFC 并不强制要求 TCP 的有效负载 gt 0 因此 理论上 TCP 堆栈可以接收有效负载为 0 的消息 所以 本质上我的问题是recv 如果接收到