Socket.AcceptAsync 方法

定义

重载

AcceptAsync()

接受传入连接。

AcceptAsync(Socket)

接受传入连接。

AcceptAsync(SocketAsyncEventArgs)

开始一个异步操作来接受一个传入的连接尝试。

AcceptAsync(CancellationToken)

接受传入连接。

AcceptAsync(Socket, CancellationToken)

接受传入连接。

AcceptAsync()

Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs

接受传入连接。

public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync ();

返回

使用接受的套接字完成的异步任务。

例外

请求了无效操作。 如果接收方 Socket 未侦听连接或者绑定了接受的套接字,将发生此异常。

Bind(EndPoint)Listen(Int32) 方法必须先于 AcceptAsync(SocketAsyncEventArgs) 方法调用。

如果套接字已连接或使用指定的 e 参数的套接字操作已经在进行中,也会发生此异常。

尝试访问套接字时出错。

注解

此方法将存储在任务中,它返回该方法的同步对应项可能引发的所有非使用异常。 如果异常存储在返回的任务中,则在等待任务时将引发该异常。 使用异常(如 ArgumentException)仍会同步引发。 有关存储的异常,请参阅 引发的 Accept()异常。

适用于

.NET 9 和其他版本
产品 版本
.NET 6, 7, 8, 9

AcceptAsync(Socket)

Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs

接受传入连接。

public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket);

参数

acceptSocket
Socket

用于接受连接的套接字。

返回

使用接受的套接字完成的异步任务。

例外

请求了无效操作。 如果接收方 Socket 未侦听连接或者绑定了接受的套接字,将发生此异常。

Bind(EndPoint)Listen(Int32) 方法必须先于 AcceptAsync(SocketAsyncEventArgs) 方法调用。

如果套接字已连接或使用指定的 e 参数的套接字操作已经在进行中,也会发生此异常。

尝试访问套接字时出错。

适用于

.NET 9 和其他版本
产品 版本
.NET 6, 7, 8, 9

AcceptAsync(SocketAsyncEventArgs)

Source:
Socket.cs
Source:
Socket.cs
Source:
Socket.cs

开始一个异步操作来接受一个传入的连接尝试。

public bool AcceptAsync (System.Net.Sockets.SocketAsyncEventArgs e);

参数

e
SocketAsyncEventArgs

要用于此异步套接字操作的 SocketAsyncEventArgs 对象。

返回

如果 I/O 操作挂起,则为 true。 操作完成时,将引发 e 参数的 Completed 事件。

如果 I/O 操作同步完成,则为 false。 将不会引发 e 参数的 Completed 事件,并且可能在方法调用返回后立即检查作为参数传递的 e 对象以检索操作的结果。

例外

自变量无效。 如果所提供的缓冲区不够大,将会发生此异常。 缓冲区必须至少为 2 * (sizeof(SOCKADDR_STORAGE + 16) 字节。

如果指定了多个缓冲区,即 BufferList 属性不为 null,也会发生此异常。

参数超出范围。 如果 Count 小于 0,将会发生此异常。

请求了无效操作。 如果接收方 Socket 未侦听连接或者绑定了接受的套接字,将发生此异常。

Bind(EndPoint)Listen(Int32) 方法必须先于 AcceptAsync(SocketAsyncEventArgs) 方法调用。

如果套接字已连接或使用指定的 e 参数的套接字操作已经在进行中,也会发生此异常。

尝试访问套接字时出错。

注解

面向连接的协议可以使用 AcceptAsync 方法异步处理传入的连接尝试。 通过异步接受连接,可以在单独的执行线程中发送和接收数据。 在调用 AcceptAsync 方法之前,必须调用 Listen 方法来侦听和排队传入的连接请求。

若要收到完成通知,必须创建实现 EventHandler<SocketAsyncEventArgs> 委托的回调方法并将其挂钩到 SocketAsyncEventArgs.Completed 事件。

对象需要 System.Net.Sockets.SocketAsyncEventArgs 以下属性和事件:

调用方可以选择性地指定要用于传入连接的现有 Socket ,方法是指定要 Socket 与 属性一起使用 SocketAsyncEventArgs.AcceptSocket 的 。

SocketAsyncEventArgs.AcceptSocket如果 属性为 null,则使用与当前 Socket 相同的 AddressFamilySocketTypeProtocolType 构造新的 Socket ,并将 设置为 属性SocketAsyncEventArgs.AcceptSocket

调用方可以在调用AcceptAsync方法之前将 SocketAsyncEventArgs.UserToken 属性设置为所需的任何用户状态对象,以便可在回调方法中检索信息。 如果回调需要比单个对象更多的信息,则可以创建一个小类来保存其他所需的状态信息作为成员。

(可选)可以提供一个缓冲区,在方法成功后 ConnectAsync 接收套接字上的初始数据块。 在这种情况下,需要将 SocketAsyncEventArgs.Buffer 属性设置为包含要接收的数据的缓冲区, SocketAsyncEventArgs.Count 而 属性需要设置为缓冲区中要接收的最大数据字节数。 可以使用 方法设置 SocketAsyncEventArgs.SetBuffer 这些属性。 传入的缓冲区的一部分将在内部使用,以供基础 Winsock AcceptEx 调用使用。 这意味着返回的数据量将始终小于提供的实例上的 SocketAsyncEventArgs.CountSystem.Net.Sockets.SocketAsyncEventArgs 属性值。 内部使用的缓冲区量因套接字的地址系列而异。 所需的最小缓冲区大小为 288 字节。 如果指定了更大的缓冲区大小,则 Socket 需要除 Winsock AcceptEx 调用接收的地址数据以外的其他一些额外数据,并将等待,直到收到此额外数据。 如果发生超时,则重置连接。 因此,如果需要特定数量的额外数据,则应将缓冲区大小设置为最小缓冲区大小加上此量。

完成回调方法应检查 SocketAsyncEventArgs.SocketError 属性以确定操作是否 AcceptAsync 成功。

SocketAsyncEventArgs.Completed在某些情况下,如果尚未接受任何连接,并导致 SocketAsyncEventArgs.SocketError 属性设置为 ConnectionReset,则可能发生该事件。 由于使用半开放 SYN 类型扫描 (SYN - SYN-ACK ->> RST 序列) 进行端口扫描,可能会发生这种情况。 使用 AcceptAsync 方法的应用程序应准备好处理此情况。

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

AcceptAsync(CancellationToken)

Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs

接受传入连接。

public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Threading.CancellationToken cancellationToken);

参数

cancellationToken
CancellationToken

可用于取消异步操作的取消标记。

返回

使用接受的套接字完成的异步任务。

例外

请求了无效操作。 如果接收方 Socket 未侦听连接或者绑定了接受的套接字,将发生此异常。

Bind(EndPoint)Listen(Int32) 方法必须先于 AcceptAsync(SocketAsyncEventArgs) 方法调用。

如果套接字已连接或使用指定的 e 参数的套接字操作已经在进行中,也会发生此异常。

尝试访问套接字时出错。

取消令牌已取消。 此异常存储在返回的任务中。

注解

此方法将存储在任务中,它返回该方法的同步对应项可能引发的所有非使用异常。 如果异常存储在返回的任务中,则在等待任务时将引发该异常。 使用异常(如 ArgumentException)仍会同步引发。 有关存储的异常,请参阅 引发的 Accept()异常。

适用于

.NET 9 和其他版本
产品 版本
.NET 6, 7, 8, 9

AcceptAsync(Socket, CancellationToken)

Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs
Source:
Socket.Tasks.cs

接受传入连接。

public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket, System.Threading.CancellationToken cancellationToken);

参数

acceptSocket
Socket

用于接受连接的套接字。

cancellationToken
CancellationToken

可用于取消异步操作的取消标记。

返回

使用接受的套接字完成的异步任务。

例外

请求了无效操作。 如果接收方 Socket 未侦听连接或者绑定了接受的套接字,将发生此异常。

Bind(EndPoint)Listen(Int32) 方法必须先于 AcceptAsync(SocketAsyncEventArgs) 方法调用。

如果套接字已连接或使用指定的 e 参数的套接字操作已经在进行中,也会发生此异常。

尝试访问套接字时出错。

取消令牌已取消。 此异常存储在返回的任务中。

适用于

.NET 9 和其他版本
产品 版本
.NET 6, 7, 8, 9