Skip to content

Socket API changes mega-issue #33418

Description

@scalablecory

This collects all the Socket APIs that have been approved: #861 #921 #938. (Edit: Also #43933.)

(Edit: removed the async overloads that elide SocketFlags, since this isn't a complete set. See #43934 instead.)

class Socket
{
	// existing: public static bool ConnectAsync(SocketType socketType, ProtocolType protocolType, SocketAsyncEventArgs e);
	public static bool ConnectAsync (SocketType socketType, ProtocolType protocolType, SocketAsyncEventArgs e, ConnectAlgorithm connectAlgorithm);
}

// new enum
enum ConnectAlgorithm
{
    // use existing behavior.
    Default,

    // use a Happy Eyeballs-like algorithm to connect.
    Parallel = 1
}

These APIs were approved and implemented in #40750:

class SocketTaskExtensions
{
	// existing: public static Task ConnectAsync (this Socket socket, EndPoint remoteEP);
	public static ValueTask ConnectAsync (this Socket socket, EndPoint remoteEP, CancellationToken cancellationToken);
	
	// existing: public static Task ConnectAsync (this Socket socket, IPAddress address, int port);
	public static ValueTask ConnectAsync (this Socket socket, IPAddress address, int port, CancellationToken cancellationToken);
	
	// existing: public static Task ConnectAsync (this Socket socket, IPAddress[] addresses, int port);
	public static ValueTask ConnectAsync (this Socket socket, IPAddress[] addresses, int port, CancellationToken cancellationToken);
	
	// existing: public static Task ConnectAsync (this Socket socket, string host, int port);
	public static ValueTask ConnectAsync (this Socket socket, string host, int port, CancellationToken cancellationToken);
}	

class TcpClient
{
	// existing: public Task ConnectAsync (string host, int port)
	public ValueTask ConnectAsync (string host, int port, CancellationToken cancellationToken);
	
	// existing: public Task ConnectAsync (IPAddress address, int port);
	public ValueTask ConnectAsync (IPAddress address, int port, CancellationToken cancellationToken);
	
	// existing: public Task ConnectAsync (IPAddress[] addresses, int port);
	public ValueTask ConnectAsync (IPAddress[] addresses, int port, CancellationToken cancellationToken);
}

These were implemented in #47229:

class Socket
{
	// existing: public static Task<int> SendToAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags, EndPoint remoteEP);
	public ValueTask<int> SendToAsync(ReadOnlyMemory<byte> buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken = null);

	// existing: public static Task<SocketReceiveFromResult> ReceiveFromAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags, EndPoint remoteEndPoint);
	public ValueTask<SocketReceiveFromResult> ReceiveFromAsync(Memory<byte> buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken = null);

	// existing: public static Task<SocketReceiveMessageFromResult> ReceiveMessageFromAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags, EndPoint remoteEndPoint);
	public ValueTask<SocketReceiveMessageFromResult> ReceiveMessageFromAsync(Memory<byte> buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken = null);

}

This was implemented in #46285:

class Socket
{
        // existing: public int ReceiveMessageFrom(byte[] buffer, int offset, int size, ref System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, out System.Net.Sockets.IPPacketInformation ipPacketInformation);
        public int ReceiveMessageFrom(Span<byte> buffer, ref System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, out System.Net.Sockets.IPPacketInformation ipPacketInformation);
}
class Socket
{
	// existing: public int SendTo(byte[] buffer, EndPoint remoteEP);
	public int SendTo(ReadOnlySpan<byte> buffer, EndPoint remoteEP);

	// existing: public int SendTo(byte[] buffer, SocketFlags socketFlags, EndPoint remoteEP);
	public int SendTo(ReadOnlySpan<byte> buffer, SocketFlags socketFlags, EndPoint remoteEP);

	// existing: public int ReceiveFrom(byte[] buffer, ref EndPoint remoteEP);
	public int ReceiveFrom(Span<byte> buffer, ref EndPoint remoteEP);

	// existing: public int ReceiveFrom(byte[] buffer, int offset, int size, SocketFlags socketFlags, ref EndPoint remoteEP);
	public int ReceiveFrom(Span<byte> buffer, SocketFlags socketFlags, ref EndPoint remoteEP);
}

These were implemented in #53340:

class Socket
{
	// existing: public static Task<Socket> AcceptAsync (this Socket socket);
	public ValueTask<Socket> AcceptAsync (CancellationToken cancellationToken);
	
	// existing: public static Task<Socket> AcceptAsync (this Socket socket, Socket acceptSocket);
	public ValueTask<Socket> AcceptAsync (Socket acceptSocket, CancellationToken cancellationToken);
}

class TcpListener
{
	// existing: public Task<Socket> AcceptSocketAsync ();
	public ValueTask<Socket> AcceptSocketAsync (CancellationToken cancellationToken);
	
	// existing: public Task<TcpClient> AcceptTcpClientAsync ();
	public ValueTask<TcpClient> AcceptTcpClientAsync (CancellationToken cancellationToken);
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions