c - 如何在TCP客户端中使用write函数验证ACK包?

标签 c sockets tcp tcpclient

我正在尝试使用 write function 编写 TCP 客户端如下:guide

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

由于它是一个 TCP 客户端,我预计会返回某种错误,因为根本没有网络,服务器将无法接收消息,因此不会返回 ACK 数据包。但是,写入函数返回已写入的2个字节,看起来它根本没有验证来自服务器端的ACK数据包

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

最佳答案

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

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

关于c - 如何在TCP客户端中使用write函数验证ACK包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374881/

相关文章:

java - 从子类/子类/继承类获取基类/父类/父类(super class)

java - 为什么当我发送两个输入流时 Spark Streaming 停止工作?

android - 无法连接到 tcp :5037: cannot connect to 127. 0.0.1 :5037: No connection could be made because the target machine actively refused it. (10061)

java - 能够发送http请求的TCP连接

使用 swig 和 Anaconda Python 找不到 Python.h

c - 如何更有效地在c中存储和搜索ipv4 ip地址

c++ - 应用程序之间的通信

c - linux C编程获取Client IP总是获取0.0.0.0

c - 理解指针算术

c - 如何避免信号处理程序中的竞争条件