Socket.AcceptAsync 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重载
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
参数
要用于此异步套接字操作的 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 相同的 AddressFamily、 SocketType和 ProtocolType 构造新的 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
参数的套接字操作已经在进行中,也会发生此异常。
尝试访问套接字时出错。
取消令牌已取消。 此异常存储在返回的任务中。