我正在使用C++套接字(Socket)通过UDP协议(SOCK_DGRAM)开发一个客户端和服务器文件传输应用程序。对于PUT方法,我在握手后进行以下操作:
客户端
Send a packet;
if time_out
send the packet again;
else //ack received
send a new packet;
服务器
wait for the first packet;
send acknowledge;
while(!EOF)
Get a packet;
Send an ack;
当EOF基本上检查我是否通过与握手期间发送的文件大小进行比较来接收整个文件时。
在此交换过程中,数据包可能会在任何时候丢失。客户端可以发送一个数据包,但该数据包会丢失。它会超时等待ACK并重新发送数据包。服务器接收到数据包并发送ACK。该ACK可能会丢失,在这种情况下,客户端会超时并重新发送其数据包。由于这些数据包具有编号序列,因此我们可以忽略已多次接收的数据包。
我的困惑出现在文件传输结束时。客户端刚刚发送了包含文件最后一位的数据包。服务器成功接收并发送了ACK。但是该数据包丢失了。服务器应用程序现在已经退出while循环,因为他已经将最后的数据写入文件,并且从他的角度来看,文件传输已成功。但是,客户端从未收到ACK,因此超时并重新发送数据包。在这里应该发生什么?服务器没有监听或正在监听新请求,而不是数据。客户端或服务器在哪个时点应该考虑传输完成并停止尝试通信?