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

时间:2014-01-02 18:30:55

标签: c# sockets

程序在根据以下代码下载文件时自行锁定:可能是什么问题?

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...");    
}

1 个答案:

答案 0 :(得分:2)

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

情侣选择:

  • 在开始接收之前,请在请求标头或其他一些旁道信息中预先确定大小。只尝试接收那么多数据。
  • 发送数据后,发送软件关闭套接字。例如,如果这是来自http请求,您可以在请求标头中指定Connection: close。当他们关闭连接时,接收将弹出(通过异常 - 由同伴关闭连接),你就会知道你已经完成了。
  • 这是hackish,但是..设置的接收超时大于接收最慢的块所需的时间。点击流结束后,您的接听电话将超时(通过例外)并且您将知道您已完成。我不推荐这种方式。