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 594a09f0247d08..a57b275a58d036 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.IO; using System.Threading.Tasks; using System.Runtime.Versioning; +using Microsoft.Win32.SafeHandles; namespace System.Net.Sockets { @@ -190,12 +191,11 @@ private void SendFileInternal(string? fileName, ReadOnlySpan preBuffer, Re { 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 @@ private void SendFileInternal(string? fileName, ReadOnlySpan preBuffer, Re } // 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 736015bb014355..a6b58ff563c563 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 @@ private Socket GetOrCreateAcceptSocket(Socket? acceptSocket, bool checkDisconnec 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 247b02a2431d94..0898a0aa7bc68c 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.Versioning; using System.Threading; using System.Threading.Tasks; +using Microsoft.Win32.SafeHandles; namespace System.Net.Sockets { @@ -3783,7 +3784,7 @@ private void ValidateBlockingMode() 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 cf25ed4c8da420..6c0d038b2a2896 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 @@ public static SocketError Send(SafeSocketHandle handle, ReadOnlySpan buffe 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)