如何检查 TCP 发送缓冲区的容量以确保数据传送

2023-12-29

我想向我的 TCP 接口添加递送确认。非阻塞写入可以填充发送缓冲区,但如果连接失败,数据可能永远不会到达 - 同时写入已报告数据已接收(通过本地套接字)。

如果我向堆栈添加额外的确认,我可以验证是否收到了每条数据。我认为 ftp 就是这样做的。但我不能借用任何人的代码,并且宁愿不实现确认/重发,特别是因为 TCP 已经完成了大部分工作。

我认为如果我可以在每次 write() 之后验证套接字发送缓冲区是否为空,就可以完成。如果没有更多数据,应该已经全部传送完毕。我不介意清空缓冲区的延迟。

编辑:我意识到 TCP/socket 实现因系统而异,但如果有 Berkeley 或 Linux 解决方案,我可能可以使用。

编辑:为了解决一些建议,我想实现三个级别的 TCP 接口,但我不知道如何完成 *'d 接口。

  • 普通 TCP,不保证交付,适用于喜欢危险生活的应用程序。
  • *即使数据包从未传递到远程应用程序,也会验证远程主机的接收情况。这降低了我的大部分连接风险(移动客户端),并且可以完全在客户端实现。我认为如果我可以验证套接字传出缓冲区是否为空,就可以实现这一点。
  • 应用层 ACK 和重发在 TCP 或 UDP 之上实现,以便验证端点。

实际上在应用程序级别确认内容是唯一的方法。这里有几个问题:

  • 当你send数据,即使它离开你的内核,直到你的TCP收到一个ACK关于它。API 不向您提供此信息.

  • 您的应用程序收到 ACK 的事实可能意味着:

    • 远程内核(不是应用程序)收到数据。不知道远程进程是否调用recv。也许它在有机会之前就崩溃了recv.
    • 一些代理(许多便宜的设备都这样做)正在与您交谈,并使用与真正的接收者的单独连接。您收到了 ACK,但您不知道远程系统是否有它。如果远程系统有它,请阅读上面的项目符号。

综上所述:

  • 您无权访问TCP ACKs
  • 即使您可以访问它们,它们也毫无用处

所以你需要一个应用程序级的ACK,但是当然无需重传. The ACK应该只是告诉您“我收到并处理了您的数据”。

EDIT

我看到你坚持你的想法。去寻找SIOCOUTQ如一些 Linux 手册页中所述。当然,它仅适用于 Linux,但看看它是否满足您的需要。

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

如何检查 TCP 发送缓冲区的容量以确保数据传送 的相关文章

  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • Android bindProcessToNetwork 和通过 MediaPlayer 的 RTSP 流

    我有一个应用程序正在使用bindProcessToNetwork 强制所有连接通过wifi 连接 这样做是因为 wifi 连接连接到没有互联网连接的相机 因此 Android 自然会尝试通过具有完整互联网连接的蜂窝数据连接推送所有流量 其代
  • 如何使用 iPhone 将照片上传到服务器?

    我正在编写一个 iPhone 应用程序 它可以拍摄照片然后将其上传到服务器 如何使用 Cocoa 将照片上传到服务器 我想我在某处使用 NSUrl Thanks Header interface EPUploader NSObject NS
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 在Android中如何停止正在等待新套接字的线程

    我正在开发一个使用 Socket 连接到服务器的软件 connectionThread new Thread new Runnable public void run InetAddress serverAddress InetAddres
  • PHP 使用 Fsockopen 发布数据

    我正在尝试使用 fsockopen 发布数据 然后返回结果 这是我当前的代码
  • 如何使用 awk 将 mac addr 转换为 int?

    Input 192 168 0 1 aa bb cc 00 11 22 192 168 0 1 aa 00 bb 11 cc 22 192 168 10 11 2a bb cc 20 11 22 192 168 10 11 aa 02 bb
  • 以编程方式切换“限制后台数据”

    如果我进入 设置 数据使用 并按 属性 我可以使用运行 Android 4 1 2 的 Samsung Galaxy S2 i9105P 激活 限制后台数据 有什么方法可以以编程方式执行此操作 无论是打开还是关闭 我只想在某些条件下激活 停
  • 在 .NET 中将套接字发送/接收超时设置为小于 500 毫秒

    根据 MSDN 文档 不可能将 Socket SendTimeout 设置为小于 500ms 的值 http msdn microsoft com en us library system net sockets socket sendti
  • Golang SSL TCP套接字证书配置

    我正在创建一个 Go TCP 服务器 不是 http s 并且尝试将其配置为使用 SSL 我有一个 StartCom 免费 SSL 证书 我正在尝试使用它来完成此任务 我的服务器代码如下所示 cert err tls LoadX509Key
  • 在 Linux 上使用命令行 PHP 检查互联网连接

    我在 Linux 上使用命令行 PHP 来打开蓝牙拨号连接 并且我需要一种快速的方法来检查互联网连接是否处于活动状态 嗯 不一定要脏 但要快 使用exec运行外部命令不是问题 我正在考虑 ping 一些稳定的服务器 例如谷歌 但我想知道是否
  • C# Directory.exist 在本地网络上始终返回 false

    我正在尝试检查目录是否存在于非网络或本地网络上 经过对 stackoverflow 和 MSDN 的一些研究后 我使用模拟方法开发了我的代码 问题是它运作得不太好 Directory exists 方法总是返回False这是我的代码 它与来
  • PHP游戏服务器,多个TCP客户端?

    我正在制作一个基于网络浏览器的多人游戏 鉴于其实时性 我确定 Websocket 是处理通信的最佳方式 客户端使用 HTML5 画布来渲染游戏 并使用 Websocket 与主机进行通信 我选择使用 PHP 来托管游戏 因为托管提供商似乎更
  • 简单的java http客户端没有服务器响应

    我正在尝试编写一个简单的 Java http 客户端 它只打印出服务器响应的一行 我的问题是我没有收到服务器的响应 这是我所拥有的 它正在编译和运行 没有明显的错误 它只是在我输入主机名后挂起 例如 www google com impor
  • 如何在C中模拟套接字

    我有一个使用套接字的函数 我会模拟它 但我找不到如何做到这一点 有没有办法在 C 中模拟套接字 Thanks 大多数系统 库函数是弱符号 https en wikipedia org wiki Weak symbol 这意味着您可以创建自己
  • socket.io 切换命名空间

    我目前正在与 socket io 进行简单的聊天 基础知识已经可以工作 但现在我正在尝试实现 2 个不同的命名空间 我希望客户端能够通过单击按钮从一个命名空间 支持聊天 切换到另一个命名空间 朋友聊天 服务器端 default namesp
  • 跟踪数据包通过内核 (linux)

    我有两台机器设置为使用 Ip Security 机器 A 我们称它们为 A 和 B 有一个套接字 该套接字绑定到本地机器上的特定 UDP 端口 并且它经常轮询它以查看是否收到任何内容在上面 当我禁用 IP 安全性时 两台机器之间的数据可以正
  • WinSock.h 和 WinSock2.h 使用哪个?

    有谁知道 WinSock h 和 WinSock2 h 之间的区别 我知道它们不使用相同的库 lib 但我不知道 WinSock2 是否仅添加了新功能 或者是否还改进了 WinSock 1 功能 我正在使用 IP TCP 套接字 并希望使用

随机推荐