【问题标题】:How to verify ACK packet with write function in TCP client?如何在 TCP 客户端中使用写入功能验证 ACK 数据包?
【发布时间】:2019-05-30 08:56:41
【问题描述】:

我正在尝试使用write function 编写一个 TCP 客户端,如下所示:guide

我关闭了我的网络并尝试发送一个包含 2 个字节数据的 PING 包。

由于它是 TCP 客户端,我预计会返回某种错误,因为根本没有网络,服务器将无法接收消息,因此不会返回 ACK 数据包。然而,write function 返回 2 个字节被写入,似乎它根本没有验证来自服务器端的 ACK packet

我如何检查 ACK 以确保我的消息是否发送成功并且服务器是否接收到它?

【问题讨论】:

  • 仅当数据成功提交到本地操作系统内核时才返回。它没有说明另一端收到的数据。如果你想拥有这样的东西,你需要在你的应用程序级别实现它,即让对等方显式地回复应用程序级别的确认。

标签: c sockets tcp tcpclient


【解决方案1】:

如果您在同一台计算机上同时运行客户端和服务器,它们将通过环回接口进行通信,因此拔出或停用出站网络接口不会改变任何事情。您的服务器和客户端可以愉快地相互通信。如果服务器和客户端之间确实没有任何连接,则 connect() 应该失败,并且如果服务器拒绝连接,则将 errno 设置为 ENETUNREACHECONNREFUSED。因此,您可能想要的是在您的机器上运行客户端,而在另一台计算机或具有桥接网络的 VM 中运行服务器。请注意,write() 成功返回仅意味着字节被缓冲以待发送。它甚至可能返回比您的消息包含的字节更少的字节,这表明缓冲区当前已满,您需要稍后尝试发送剩余的字节。

分析协议实现的最佳方法是使用像 wireshark 这样的工具来查看实际通过网络(或通过环回接口)发送的包。

【讨论】:

  • 我正在尝试将消息发送到远程服务器,而不是在同一个本地网络中。我在网络仍然正常时调用了函数connect(),因此它不会引发任何投诉,我只在connect()write() 之前切断了网络。顺便说一句,正如@Steffen 上面评论的那样,我误解了write() 函数的使用,也许我需要在应用层进行某种PING 响应来验证ACK。
  • @ToanTran 对。你可以让服务器写一条消息(概念上在应用层),表明他已经完成了你发送的任何数据。为了准确以防其他人阅读此内容,PING 通常意味着与您所指的不同。 PING 是通过 ICMP 传递的数据包,根本不涉及 TCP。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2014-04-27
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多