跟踪文件传输百分比

时间:2014-04-08 19:23:20

标签: c# sockets tcp

我已经开始用C#学习TCP网络。我已经按照各种教程查看了那里的示例代码,并通过异步连接和写入/读取有一个工作的TCP服务器和客户端。我也有文件传输工作。

现在,我希望能够在服务器和客户端上跟踪传输进度(0% - > 100%)。当启动从服务器到客户端的传输时,我发送了预期的文件大小,因此客户端知道期望的字节数,所以我想我可以轻松地在客户端上执行: curCount / totalCount 。但我对如何为服务器执行此操作感到有点困惑。

服务器判断客户端的传输情况有多准确?我应该根据服务器自身的状态(通过networkStream.BeginWrite()回调,还是通过磁盘和网络写入的块加载)来猜测?或者我应该让客户端中继回服务器客户端完成吗?

我想知道何时关闭连接,以及能够直观地显示进度。服务器是否应该信任客户端关闭连接(禁止网络错误/超时/等)?或者服务器可以在写入流后立即关闭连接吗?

1 个答案:

答案 0 :(得分:0)

这里有两个不同的完成百分比:客户端和服务器。如果您认为服务器在发送最后一个字节时已完成,则服务器的百分比将始终至少与客户端的百分比一样高。如果您认为在客户端处理完最后一个字节时要完成服务器,则服务器的百分比将落后于客户端的百分比。无论你做什么,你都会在两端都有不同的价值观。

值将根据服务器应用程序和客户端应用程序之间的各种缓冲区中当前排队的数据量而有所不同。这个缓冲区通常很小。 AFAIK最大TCP窗口大小默认为200ms的数据传输。

或许,您根本不需要担心这个问题,因为双方的进度值将紧密相关。

  

我应该根据服务器自身的状态猜测(通过networkStream.BeginWrite()回调,还是通过磁盘和网络写入的块加载)?

这是一个合适的解决方案。

  

或者我应该让客户端中继回服务器客户端完成吗?

这是我在第1段中描述的第二个案例。也可以接受,但不一定是更好的结果和更多的开销。我无法想象我现在就这样做的情况。

  

服务器是否应该信任客户端关闭连接(禁止网络错误/超时等)?

当TCP交换的一方完成发送时,应关闭套接字以进行发送(使用Socket.Shutdown(Send))。这将导致另一方读取零字节并知道传输已完成。

在关闭套接字之前,应该关闭它。如果Shutdown呼叫完成且没有错误,则保证远程方已收到所有数据,并且本地方也已收到所有数据。

  

或者服务器可以在写入流后立即关闭连接吗?

首先,关闭,然后关闭。单独关闭并不意味着成功转移。