tcp - 如何等到您的 TCP 消息被确认

标签 tcp winsock packet

背景:

我们有一个使用持久连接到服务器的客户端/服务器应用程序。

基准测试表明,使用已打开的连接比花费大量时间(2.5 秒)建立新连接(加密)要快很多倍。

不幸的是,旧连接可能已失效。

有没有办法等待发送消息的系统级结果[ACK 或错误]?

等待读取然后到达流的结尾会导致混淆。

我知道消息可能会被分解成数据包。知道消息的任何部分是否被确认或是否全部被确认同样符合我的目的。这里有趣的问题是过时的连接。

最佳答案

Unfortunately, the old connection may be stale.

在这种情况下,您最终会在写入时遇到异常。

Is there a way to wait for the system-level result of sending a message [either ACK or error]?

没有。

Waiting for read and then getting the end of stream causes confusion.

对谁的困惑?处理困惑是代码的工作。如果您收到意外的 EOS,对等方已关闭连接,或者中间防火墙已经关闭,在这种情况下您必须处理它。

I know the message might be broken up into packets.

完全不相关。您无法控制它或它的任何可见性。你得到的是一个被 EOS 或异常终止的字节流。

It would suit my purposes equally well to know either if any part of the message was acked or if all of it was.

不,不会。 ACK 仅表示它已到达对等方的 TCP/IP 堆栈。您的应用程序感兴趣的是它是否已进入对等应用程序,并且只有对等应用程序可以通过应用程序协议(protocol)级别的 ACK 告诉您。 TCP/IP ACK 在这里没有帮助。

The interesting problem here is stale connection.

这是一个相当微不足道的问题。您可以在代码中检测到它,也可以同样处理它。数据库供应商几十年来一直在做这件事。不是火箭科学,也不需要 TCP ACK 的知识。

关于tcp - 如何等到您的 TCP 消息被确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169090/

相关文章:

java - 防止通过 TCP 拆分数据包

c - 使用 pcap 段错误进行数据包嗅探

c# - TCP 监听器将消息剪切为 1024 字节

windows-services - 如何知道哪个本地应用程序连接到我的套接字(Windows)

c++ - 接收整个 UDP 数据包

c++ - 如何向 socks5 代理服务器添加身份验证?

c++ winsock recv在接收到0数据时终止线程而不是返回错误代码

TCP 缓冲区大小和以太网绑定(bind)

java - 服务器套接字总是向客户端返回空值,Java

c++ - Boost::ASIO:优化以最小的流量,长连接,小消息,立即传递