Skip to content

Commit 4b3db59

Browse files
authored
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.
1 parent b0cea40 commit 4b3db59

File tree

4 files changed

+13
-18
lines changed

4 files changed

+13
-18
lines changed

src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Unix.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.IO;
66
using System.Threading.Tasks;
77
using System.Runtime.Versioning;
8+
using Microsoft.Win32.SafeHandles;
89

910
namespace System.Net.Sockets
1011
{
@@ -190,12 +191,11 @@ private void SendFileInternal(string? fileName, ReadOnlySpan<byte> preBuffer, Re
190191
{
191192
CheckTransmitFileOptions(flags);
192193

194+
SocketError errorCode = SocketError.Success;
195+
193196
// Open the file, if any
194197
// Open it before we send the preBuffer so that any exception happens first
195-
FileStream? fileStream = OpenFile(fileName);
196-
197-
SocketError errorCode = SocketError.Success;
198-
using (fileStream)
198+
using (SafeFileHandle? fileHandle = OpenFileHandle(fileName))
199199
{
200200
// Send the preBuffer, if any
201201
// This will throw on error
@@ -205,10 +205,10 @@ private void SendFileInternal(string? fileName, ReadOnlySpan<byte> preBuffer, Re
205205
}
206206

207207
// Send the file, if any
208-
if (fileStream != null)
208+
if (fileHandle != null)
209209
{
210210
// This can throw ObjectDisposedException.
211-
errorCode = SocketPal.SendFile(_handle, fileStream);
211+
errorCode = SocketPal.SendFile(_handle, fileHandle);
212212
}
213213
}
214214

src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -397,14 +397,11 @@ private Socket GetOrCreateAcceptSocket(Socket? acceptSocket, bool checkDisconnec
397397

398398
private void SendFileInternal(string? fileName, ReadOnlySpan<byte> preBuffer, ReadOnlySpan<byte> postBuffer, TransmitFileOptions flags)
399399
{
400-
// Open the file, if any
401-
FileStream? fileStream = OpenFile(fileName);
402-
403400
SocketError errorCode;
404-
using (fileStream)
405-
{
406-
SafeFileHandle? fileHandle = fileStream?.SafeFileHandle;
407401

402+
// Open the file, if any
403+
using (SafeFileHandle? fileHandle = OpenFileHandle(fileName))
404+
{
408405
// This can throw ObjectDisposedException.
409406
errorCode = SocketPal.SendFile(_handle, fileHandle, preBuffer, postBuffer, flags);
410407
}

src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Runtime.Versioning;
1414
using System.Threading;
1515
using System.Threading.Tasks;
16+
using Microsoft.Win32.SafeHandles;
1617

1718
namespace System.Net.Sockets
1819
{
@@ -3783,7 +3784,7 @@ private void ValidateBlockingMode()
37833784
partial void ValidateForMultiConnect(bool isMultiEndpoint);
37843785

37853786
// Helper for SendFile implementations
3786-
private static FileStream? OpenFile(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenRead(name);
3787+
private static SafeFileHandle? OpenFileHandle(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenHandle(name, FileMode.Open, FileAccess.Read);
37873788

37883789
private void UpdateReceiveSocketErrorForDisposed(ref SocketError socketError, int bytesTransferred)
37893790
{

src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,13 +1172,10 @@ public static SocketError Send(SafeSocketHandle handle, ReadOnlySpan<byte> buffe
11721172
return errorCode;
11731173
}
11741174

1175-
public static SocketError SendFile(SafeSocketHandle handle, FileStream fileStream)
1175+
public static SocketError SendFile(SafeSocketHandle handle, SafeFileHandle fileHandle)
11761176
{
11771177
long offset = 0;
1178-
long length = fileStream.Length;
1179-
1180-
SafeFileHandle fileHandle = fileStream.SafeFileHandle;
1181-
1178+
long length = RandomAccess.GetLength(fileHandle);
11821179
long bytesTransferred = 0;
11831180

11841181
if (!handle.IsNonBlocking)

0 commit comments

Comments
 (0)