【发布时间】:2012-03-23 10:37:15
【问题描述】:
我正在开发一个客户端和一个服务器文件传输应用程序,该应用程序带有基于 UDP (SOCK_DGRAM) 的 C++ 套接字。对于 PUT 方法,我有以下执行(握手后):
client
Send a packet;
if time_out
send the packet again;
else //ack received
send a new packet;
server
wait for the first packet;
send acknowledge;
while(!EOF)
Get a packet;
Send an ack;
EOF 基本上是通过与我在握手期间发送的文件大小进行比较来检查我是否收到了整个文件。
在此交换期间,数据包可能随时丢失。客户端可以发送丢失的数据包。它会超时等待 ACK 并重新发送数据包。服务器接收数据包并发送ACK。该 ACK 可能会丢失,此时客户端超时并重新发送他的数据包。由于这些数据包有一个编号序列,我们可以忽略我们多次收到的数据包。
我的困惑发生在文件传输结束时。客户端刚刚发送了包含文件最后几位的数据包。服务器成功接收到它并发送他的ACK。此数据包丢失。服务器应用程序现在位于 while 循环之外,因为他已将最后一位写入文件,并且从他的角度来看,文件传输是成功的。但是,客户端从未收到 ACK,因此超时并重新发送数据包。这里应该发生什么?服务器未在侦听或正在侦听新请求,而不是数据。客户端或服务器应该在什么时候认为传输完成并停止尝试通信?
【问题讨论】:
标签: c++ sockets ftp udp file-transfer