Skip to content

Socket API changes mega-issue #33418

Closed
Closed
@scalablecory

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);
}

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