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();
public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync ();
member this.AcceptAsync : unit -> System.Threading.Tasks.Task<System.Net.Sockets.Socket>
Public Function AcceptAsync () As Task(Of Socket)

返回

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

例外

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

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

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

尝试访问套接字时出错。

注解

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

适用于

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);
public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket);
member this.AcceptAsync : System.Net.Sockets.Socket -> System.Threading.Tasks.Task<System.Net.Sockets.Socket>
Public Function AcceptAsync (acceptSocket As Socket) As Task(Of Socket)

参数

acceptSocket
Socket

用于接受连接的套接字。

返回

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

例外

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

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

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

尝试访问套接字时出错。

适用于

AcceptAsync(SocketAsyncEventArgs)

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

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

public:
 bool AcceptAsync(System::Net::Sockets::SocketAsyncEventArgs ^ e);
public bool AcceptAsync (System.Net.Sockets.SocketAsyncEventArgs e);
member this.AcceptAsync : System.Net.Sockets.SocketAsyncEventArgs -> bool
Public Function AcceptAsync (e As SocketAsyncEventArgs) As Boolean

参数

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 方法的应用程序应准备好处理此情况。

另请参阅

适用于

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);
public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Threading.CancellationToken cancellationToken);
member this.AcceptAsync : System.Threading.CancellationToken -> System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket>
Public Function AcceptAsync (cancellationToken As CancellationToken) As ValueTask(Of Socket)

参数

cancellationToken
CancellationToken

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

返回

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

例外

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

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

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

尝试访问套接字时出错。

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

注解

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

适用于

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);
public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket, System.Threading.CancellationToken cancellationToken);
member this.AcceptAsync : System.Net.Sockets.Socket * System.Threading.CancellationToken -> System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket>
Public Function AcceptAsync (acceptSocket As Socket, cancellationToken As CancellationToken) As ValueTask(Of Socket)

参数

acceptSocket
Socket

用于接受连接的套接字。

cancellationToken
CancellationToken

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

返回

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

例外

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

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

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

尝试访问套接字时出错。

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

适用于