如何在TCP客户端用写功能验证ACK数据包?

如何在TCP客户端用写功能验证ACK数据包?,c,sockets,tcp,tcpclient,C,Sockets,Tcp,Tcpclient,我正在尝试使用以下内容编写TCP客户端: 我关闭了网络并尝试发送一个包含2字节数据的PING包 由于它是TCP客户端,我希望返回某种错误,因为根本没有网络,服务器将无法接收消息,因此不会返回ACK数据包。然而,write函数返回写入的2个字节,似乎根本无法从服务器端验证ACK数据包 我如何检查确认以确保我的消息是否成功发送并被服务器接收?如果在同一台机器上运行客户端和服务器,它们将通过环回接口进行通信,那么拔下或停用出站网络接口不会改变任何事。您的服务器和客户端可以愉快地相互通信。如果服务器和客

我正在尝试使用以下内容编写TCP客户端:

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

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


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

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


分析协议实现的最佳方法是使用wireshark之类的工具查看哪些包实际上是通过有线(或通过环回接口)发送的

如果数据成功提交到本地操作系统内核,则只写返回。它没有说明在另一端接收到的数据。如果你想有这样的东西,你需要在你的应用程序级别上实现它,也就是说,让对等方显式地回复一个应用程序级别的确认信息。可能是我试图向远程服务器发送消息的重复,而不是在同一个本地网络中。我在网络仍处于运行状态时调用了函数
connect()
,因此它不会引发任何投诉,我只在
connect()
之后和
write()
之前切断网络。顺便说一句,正如@Steffen在上面所评论的,我误解了
write()
函数的用法,也许我需要在应用层上进行某种PING响应来验证确认。@ToanTran right。您可以让服务器编写一条消息(概念上是在应用程序层上),表明他已经处理了您发送的任何数据。为了准确起见,万一有人读到这篇文章,PING通常意味着与您所指的内容不同的内容。ping是通过根本不涉及TCP的ICMP传递的数据包。