在c#套接字中接收未知文件大小

在c#套接字中接收未知文件大小,c#,sockets,C#,Sockets,程序在下载文件时会根据下面的代码锁定自身:可能有什么问题 if (bufferInfo.Contains("fileExists")) { FileStream downloadFileStream = new FileStream(folderName + "\\" + requestFileName.Text, FileMode.Create); activityLog.AppendText("File is found, it will be downloaded !");

程序在下载文件时会根据下面的代码锁定自身:可能有什么问题

if (bufferInfo.Contains("fileExists"))
{
    FileStream downloadFileStream = new FileStream(folderName + "\\" + requestFileName.Text, FileMode.Create);
    activityLog.AppendText("File is found, it will be downloaded !");
    byte[] myReadBufferExists = new byte[8196];

    do
    {
        bytesRead = clientSocket.Receive(myReadBufferExists);
        downloadFileStream.Write(myReadBufferExists,0,bytesRead);
    } while (bytesRead != 0);

    downloadFileStream.Close();
    clientSocket.Close();
    bufferInfo.Replace("fileExists","");
    activityLog.AppendText("File has been received now writing to the disk...");    
}

它锁定
clientSocket.Receive(myReadBufferExists)
调用。这是因为默认情况下,Receive将尝试填充您传递给它的缓冲区。如果您无休止地调用Receive,当没有更多数据时,它将最终阻塞

两个选项:

  • 在开始接收之前,在请求头或其他侧通道信息中预先计算出大小。只尝试接收那么多数据
  • 发送数据后,让发送软件关闭套接字。例如,如果这是来自http请求,则可以在请求头中指定
    Connection:close
    。当他们关闭连接时,Receive将弹出(通过异常-对等方关闭的连接),您将知道您已经完成了
  • 这有点刻薄,但是。。设置一个接收超时,该超时大于接收最慢数据块所需的时间。当您到达流的末尾时,您的接收呼叫将超时(通过异常),您将知道您已完成。我不推荐这种方式

锁在哪里?你设置了断点吗?完成了一些基本调试?可能您的服务器没有关闭套接字,而您的客户端在
clientSocket处等待。Receive
在旁注中,您是如何得出8196作为一个好的缓冲区大小的?