C#通过套接字读取和写入文件

时间:2016-04-22 01:16:02

标签: c# sockets tcp byte file-writing

我现在有一个非常奇怪的问题,我是如何通过套接字发送数据的。我的读取缓冲区正在获取我通过套接字发送的所有数据,但由于某种原因,我正在调用的File.Write或File.WriteAsync方法没有写入所有字节,或者只是停止(我认为这是问题)或者它可能是套接字有问题以及它们如何被读写。

所以这里是我的代码片段,请记住,这两个代码都在同一个文件中,但它们是不同的线程。

   byte[] Buffer = new Byte[1024];
   int bytesRead;
   while((bytesRead = ReceiverSocket.Receive(Buffer)) > 0)
            {
                totalBytesRead += bytesRead;
                //myDownload.Write(Buffer, 0, bytesRead);
                myDownload.WriteAsync(Buffer, 0, bytesRead);
            }

上面的代码是我的下载客户端的接收功能。请记住,无论我使用什么写法,我都会得到相同的结果。

我只是使用它:

    byte[] fileData = File.ReadAllBytes(fileToSend);
    serverSocket.SendFile(fileToSend);

我发送一个文件大小为10560的文件并实际检索接收循环中的所有字节,但是当我完成后检查我的文件时,它只收到这样的部分:

TotalBytesRead

1024

2048

3072 ...

... 8192

9216

10240

10560

这意味着它会读取所有数据,但是在我的程序中,它仍然停留在循环中,当我关闭它以检查文件大小时,它的大小是8192,所以在我看来它没有读取下一个3套接字流。

我为此感到茫然,有什么我做错了吗?这可能是我不知道的线程问题吗?

1 个答案:

答案 0 :(得分:0)

我找到了答案,我锁定了我的

    while((bytesRead = ReceiverSocket.Receive(Buffer)) > 0)

由于套接字总是等待接收,所以SendFile不一定会发送0,所以它总是卡在while循环中,但是我关闭了while,它写完了文件。