在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请求,则可以在请求头中指定
。当他们关闭连接时,Receive将弹出(通过异常-对等方关闭的连接),您将知道您已经完成了Connection:close
- 这有点刻薄,但是。。设置一个接收超时,该超时大于接收最慢数据块所需的时间。当您到达流的末尾时,您的接收呼叫将超时(通过异常),您将知道您已完成。我不推荐这种方式
clientSocket处等待。Receive
在旁注中,您是如何得出8196作为一个好的缓冲区大小的?