From 4b3db59e280562d56a6a77e6aa94d7333137b14d Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Wed, 4 Aug 2021 04:00:20 +0800 Subject: [PATCH] Use File.OpenHandle in Socket.SendFile directly (#56777) * Directly open file handle in Windows. * Directly open file handle on Unix. * Dispose FileHandle. * Update scope of using. --- .../System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs | 12 ++++++------ .../src/System/Net/Sockets/Socket.Windows.cs | 9 +++------ .../System.Net.Sockets/src/System/Net/Sockets/Socket.cs | 3 ++- .../src/System/Net/Sockets/SocketPal.Unix.cs | 7 ++----- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs index 594a09f..a57b275 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.IO; using System.Threading.Tasks; using System.Runtime.Versioning; +using Microsoft.Win32.SafeHandles; namespace System.Net.Sockets { @@ -190,12 +191,11 @@ namespace System.Net.Sockets { CheckTransmitFileOptions(flags); + SocketError errorCode = SocketError.Success; + // Open the file, if any // Open it before we send the preBuffer so that any exception happens first - FileStream? fileStream = OpenFile(fileName); - - SocketError errorCode = SocketError.Success; - using (fileStream) + using (SafeFileHandle? fileHandle = OpenFileHandle(fileName)) { // Send the preBuffer, if any // This will throw on error @@ -205,10 +205,10 @@ namespace System.Net.Sockets } // Send the file, if any - if (fileStream != null) + if (fileHandle != null) { // This can throw ObjectDisposedException. - errorCode = SocketPal.SendFile(_handle, fileStream); + errorCode = SocketPal.SendFile(_handle, fileHandle); } } diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs index 736015b..a6b58ff 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs @@ -397,14 +397,11 @@ namespace System.Net.Sockets private void SendFileInternal(string? fileName, ReadOnlySpan preBuffer, ReadOnlySpan postBuffer, TransmitFileOptions flags) { - // Open the file, if any - FileStream? fileStream = OpenFile(fileName); - SocketError errorCode; - using (fileStream) - { - SafeFileHandle? fileHandle = fileStream?.SafeFileHandle; + // Open the file, if any + using (SafeFileHandle? fileHandle = OpenFileHandle(fileName)) + { // This can throw ObjectDisposedException. errorCode = SocketPal.SendFile(_handle, fileHandle, preBuffer, postBuffer, flags); } diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs index 247b02a..0898a0a 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @@ -13,6 +13,7 @@ using System.Runtime.ExceptionServices; using System.Runtime.Versioning; using System.Threading; using System.Threading.Tasks; +using Microsoft.Win32.SafeHandles; namespace System.Net.Sockets { @@ -3783,7 +3784,7 @@ namespace System.Net.Sockets partial void ValidateForMultiConnect(bool isMultiEndpoint); // Helper for SendFile implementations - private static FileStream? OpenFile(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenRead(name); + private static SafeFileHandle? OpenFileHandle(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenHandle(name, FileMode.Open, FileAccess.Read); private void UpdateReceiveSocketErrorForDisposed(ref SocketError socketError, int bytesTransferred) { diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs index cf25ed4..6c0d038 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @@ -1172,13 +1172,10 @@ namespace System.Net.Sockets return errorCode; } - public static SocketError SendFile(SafeSocketHandle handle, FileStream fileStream) + public static SocketError SendFile(SafeSocketHandle handle, SafeFileHandle fileHandle) { long offset = 0; - long length = fileStream.Length; - - SafeFileHandle fileHandle = fileStream.SafeFileHandle; - + long length = RandomAccess.GetLength(fileHandle); long bytesTransferred = 0; if (!handle.IsNonBlocking) -- 2.7.4