我正在尝试使用write function编写一个TCP客户端,如下所示:guide。
我关闭了网络,并尝试发送包含2个字节数据的PING包。
因为它是TCP客户端,所以我预计会返回某种错误,因为根本没有网络,并且服务器将无法接收消息,因此不会返回ACK数据包。但是,写入功能返回了写入的2个字节,似乎根本没有从服务器端验证 ACK数据包。
我如何检查 ACK 以确保我的消息是否成功发送并服务器接收到?
非常感谢。
答案 0 :(得分:1)
如果您在同一台计算机上同时运行客户端和服务器,则它们将通过回送接口进行通信,因此拔出或禁用出站网络接口不会更改任何内容。您的服务器和客户端彼此之间进行愉快的通信。如果服务器与客户端之间确实没有任何连接,则connect()
应该失败,并且如果服务器拒绝连接,则errno设置为ENETUNREACH
或ECONNREFUSED
。因此,您可能想要在另一台计算机或具有桥接网络的VM中的计算机和服务器上运行客户端。请注意,write()
成功返回仅表示字节被缓冲以待发送。它甚至可能返回的字节数少于消息中包含的字节数,表明缓冲区当前已满,您需要稍后再发送剩余的字节。
分析协议实现的最好方法是使用wireshark之类的工具来查看实际上是通过网络(或通过环回接口)发送了哪些程序包。