套接字c夏普上的大文件

时间:2013-11-27 15:23:33

标签: c# sockets network-programming byte

我已经读完了,我听到有关此问题的混杂内容。您是否必须将文件拆分为块以通过流发送?或OS是否为您做到了?

我有一个大约320,000个值的字节数组,我需要通过网络。我可以获得前几千个,但之后的任何事情,它只是设置为0。

我正在使用NetworkStream类,创建一个TcpListener / TcpClient,连接后从侦听器获取流并将数组写入流然后刷新。没有成功。

任何帮助都将不胜感激。

干杯,

1 个答案:

答案 0 :(得分:2)

使用TCP套接字时,OS可能会也可能不会将发送1024个字节的内容拆分成块。在我们的级别上的这种行为应该被认为是未定义的,接收器应该能够处理这种情况。大多数协议所做的是指定某个(已知的)消息大小,其中包含诸如文件大小,应该读取的数据范围等信息等。服务器构造的每条消息都将具有此标头。您作为程序员可以指定您的块大小,并且每个块必须在接收器级别重建。

这是一个演练:

  1. 服务器向客户端发送命令,其中包含有关文件的信息,例如总大小,文件名等。
  2. 客户端知道命令的大小取决于头编程大小的预编程协议。如果命令是512字节,则客户端将继续接收数据,直到它填充512字节缓冲区。在幕后,操作系统本可以在多个块中选择数据,但这不应该让您担心。毕竟,你只关心读取512字节。
  3. 服务器开始发送更多命令,通过块将文件流式传输到客户端块(每次512字节)。
  4. 客户端接收这些块并在连接过程中构造文件。
  5. 由于客户端知道文件有多大,因此不再读取该套接字。
  6. 服务器终止连接。
  7. 这个例子非常基础,但它是沟通如何运作的良好基础。