From 64048543af091941cd38c73c1e8e688c77c08015 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Thu, 30 Jan 2020 14:52:46 +0100 Subject: [PATCH] Support calling ConnectAsync for connectionless protocols --- .../src/System/Net/Sockets/Socket.cs | 10 +++++++++- .../System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 3 +++ .../System/Net/Sockets/SocketAsyncEventArgs.Windows.cs | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) 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 b93d08171590c..fab74cdd68d06 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 @@ -3779,7 +3779,15 @@ private bool ConnectAsync(SocketAsyncEventArgs e, bool userSocket) SocketError socketError = SocketError.Success; try { - socketError = e.DoOperationConnect(this, _handle); + if (CanUseConnectEx(endPointSnapshot)) + { + socketError = e.DoOperationConnectEx(this, _handle); + } + else + { + // For connectionless protocols, Connect is not an I/O call. + socketError = e.DoOperationConnect(this, _handle); + } } catch { diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index ff3d37a54a47a..877f65a566b87 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -95,6 +95,9 @@ private void ConnectCompletionCallback(SocketError socketError) CompletionCallback(0, SocketFlags.None, socketError); } + internal unsafe SocketError DoOperationConnectEx(Socket socket, SafeSocketHandle handle) + => DoOperationConnect(socket, handle); + internal unsafe SocketError DoOperationConnect(Socket socket, SafeSocketHandle handle) { SocketError socketError = handle.AsyncContext.ConnectAsync(_socketAddress.Buffer, _socketAddress.Size, ConnectCompletionCallback); diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs index 29a0226031b74..08844f6799fa1 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs @@ -272,6 +272,15 @@ internal unsafe SocketError DoOperationAccept(Socket socket, SafeSocketHandle ha } internal unsafe SocketError DoOperationConnect(Socket socket, SafeSocketHandle handle) + { + // Called for connectionless protocols. + SocketError socketError = SocketPal.Connect(handle, _socketAddress.Buffer, _socketAddress.Size); + FinishOperationSync(socketError, 0, SocketFlags.None); + Debug.Assert(socketError != socketError.IOPending); + return socketError; + } + + internal unsafe SocketError DoOperationConnectEx(Socket socket, SafeSocketHandle handle) { // ConnectEx uses a sockaddr buffer containing the remote address to which to connect. // It can also optionally take a single buffer of data to send after the connection is complete.