118 lines
9.8 KiB
Markdown
118 lines
9.8 KiB
Markdown
|
|
#unity/日常积累
|
|||
|
|
|
|||
|
|
# Socket.ConnectAsync 方法
|
|||
|
|
|
|||
|
|
- 参考
|
|||
|
|
|
|||
|
|
反馈
|
|||
|
|
|
|||
|
|
[](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0#definition)
|
|||
|
|
|
|||
|
|
## 定义
|
|||
|
|
|
|||
|
|
命名空间:
|
|||
|
|
|
|||
|
|
[System.Net.Sockets](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets?view=net-8.0)
|
|||
|
|
|
|||
|
|
程序集:
|
|||
|
|
|
|||
|
|
System.Net.Sockets.dll
|
|||
|
|
|
|||
|
|
开始一个对远程主机连接的异步请求。
|
|||
|
|
|
|||
|
|
## ConnectAsync(SocketType, ProtocolType, SocketAsyncEventArgs)
|
|||
|
|
|
|||
|
|
Source:
|
|||
|
|
|
|||
|
|
[Socket.cs](https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs#L2827C13-L2863C28)
|
|||
|
|
|
|||
|
|
``` cs
|
|||
|
|
public static bool ConnectAsync (System.Net.Sockets.SocketType socketType, System.Net.Sockets.ProtocolType protocolType, System.Net.Sockets.SocketAsyncEventArgs e);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 参数
|
|||
|
|
|
|||
|
|
socketType
|
|||
|
|
|
|||
|
|
[SocketType](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.sockettype?view=net-8.0)
|
|||
|
|
|
|||
|
|
[SocketType](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.sockettype?view=net-8.0) 值之一。
|
|||
|
|
|
|||
|
|
protocolType
|
|||
|
|
|
|||
|
|
[ProtocolType](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.protocoltype?view=net-8.0)
|
|||
|
|
|
|||
|
|
[ProtocolType](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.protocoltype?view=net-8.0) 值之一。
|
|||
|
|
|
|||
|
|
e
|
|||
|
|
|
|||
|
|
[SocketAsyncEventArgs](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs?view=net-8.0)
|
|||
|
|
|
|||
|
|
要用于此异步套接字操作的 [SocketAsyncEventArgs](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs?view=net-8.0) 对象。
|
|||
|
|
|
|||
|
|
#### 返回
|
|||
|
|
|
|||
|
|
[Boolean](https://learn.microsoft.com/zh-cn/dotnet/api/system.boolean?view=net-8.0)
|
|||
|
|
|
|||
|
|
如果 I/O 操作挂起,则为 `true`。 操作完成时,将引发 `e` 参数的 [Completed](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.completed?view=net-8.0#system-net-sockets-socketasynceventargs-completed) 事件。
|
|||
|
|
|
|||
|
|
如果 I/O 操作同步完成,则为 `false`。 在这种情况下,将不会引发 `e` 参数的 [Completed](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.completed?view=net-8.0#system-net-sockets-socketasynceventargs-completed) 事件,并且可能在方法调用返回后立即检查作为参数传递的 `e` 对象以检索操作的结果。
|
|||
|
|
|
|||
|
|
#### 例外
|
|||
|
|
|
|||
|
|
[ArgumentException](https://learn.microsoft.com/zh-cn/dotnet/api/system.argumentexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
自变量无效。 如果指定了多个缓冲区,即 [BufferList](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.bufferlist?view=net-8.0#system-net-sockets-socketasynceventargs-bufferlist) 属性不为 null,将会发生此异常。
|
|||
|
|
|
|||
|
|
[ArgumentNullException](https://learn.microsoft.com/zh-cn/dotnet/api/system.argumentnullexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
`e` 参数不能为 null,并且 [RemoteEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.remoteendpoint?view=net-8.0#system-net-sockets-socketasynceventargs-remoteendpoint) 不能为空。
|
|||
|
|
|
|||
|
|
[InvalidOperationException](https://learn.microsoft.com/zh-cn/dotnet/api/system.invalidoperationexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
[Socket](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?view=net-8.0) 正在侦听或已经在使用 `e` 参数中指定的 [SocketAsyncEventArgs](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs?view=net-8.0) 对象执行套接字操作。
|
|||
|
|
|
|||
|
|
[SocketException](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
尝试访问套接字时出错。
|
|||
|
|
|
|||
|
|
[NotSupportedException](https://learn.microsoft.com/zh-cn/dotnet/api/system.notsupportedexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
本地终结点和 [RemoteEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.remoteendpoint?view=net-8.0#system-net-sockets-socketasynceventargs-remoteendpoint) 不是同一个地址系列。
|
|||
|
|
|
|||
|
|
[ObjectDisposedException](https://learn.microsoft.com/zh-cn/dotnet/api/system.objectdisposedexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
[Socket](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?view=net-8.0) 已关闭。
|
|||
|
|
|
|||
|
|
[SecurityException](https://learn.microsoft.com/zh-cn/dotnet/api/system.security.securityexception?view=net-8.0)
|
|||
|
|
|
|||
|
|
调用堆栈中的较高调用方无权执行所请求的操作。
|
|||
|
|
|
|||
|
|
### 注解
|
|||
|
|
|
|||
|
|
如果使用面向连接的协议,则 M:System.Net.Sockets.Socket.ConnectAsync (System.Net.Sockets.SocketType,System.Net.Sockets.ProtocolType,System.Net.Sockets.SocketAsyncEventArgs) 方法启动与远程主机连接的异步请求。 如果使用无连接协议, [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0) 将建立由 `socketType` 和 `protocolType` 参数指定的默认远程主机。
|
|||
|
|
|
|||
|
|
若要收到完成通知,必须创建实现 EventHandler<SocketAsyncEventArgs> 委托的回调方法,并将回调附加到 [SocketAsyncEventArgs.Completed](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.completed?view=net-8.0#system-net-sockets-socketasynceventargs-completed) 事件。
|
|||
|
|
|
|||
|
|
调用方必须将 属性设置为[SocketAsyncEventArgs.RemoteEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.remoteendpoint?view=net-8.0)[IPEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.ipendpoint?view=net-8.0)要连接到的远程主机的 。
|
|||
|
|
|
|||
|
|
调用方可以在调用[ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0)方法之前将 [SocketAsyncEventArgs.UserToken](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.usertoken?view=net-8.0) 属性设置为所需的任何用户状态对象,以便可在回调方法中检索信息。 如果回调需要比单个对象更多的信息,则可以创建一个小类来保存其他所需的状态信息作为成员。
|
|||
|
|
|
|||
|
|
如果使用 UDP 等无连接协议,则不必在发送和接收数据之前调用 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0) 。 可以使用 [SendToAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.sendtoasync?view=net-8.0) 和 [ReceiveFromAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.receivefromasync?view=net-8.0) 与远程主机通信。 如果确实调用 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0),则将放弃从指定默认值以外的地址到达的任何数据报。 如果要更改默认远程主机,请使用所需的终结点再次调用 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0) 方法。
|
|||
|
|
|
|||
|
|
如果要将默认远程主机设置为广播地址,必须首先调用 [SetSocketOption](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.setsocketoption?view=net-8.0) 并将 Broadcast 设置为 `true`。 如果未完成此操作,该方法 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0) 将引发 [SocketException](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketexception?view=net-8.0)。
|
|||
|
|
|
|||
|
|
对象需要 [System.Net.Sockets.SocketAsyncEventArgs](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs?view=net-8.0) 以下属性和事件:
|
|||
|
|
|
|||
|
|
- [SocketAsyncEventArgs.Completed](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.completed?view=net-8.0#system-net-sockets-socketasynceventargs-completed)
|
|||
|
|
|
|||
|
|
- [SocketAsyncEventArgs.RemoteEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.remoteendpoint?view=net-8.0)
|
|||
|
|
|
|||
|
|
|
|||
|
|
(可选)可以提供缓冲区,该方法成功后 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0) 将在套接字上以原子方式发送。 在这种情况下,需要将 [SocketAsyncEventArgs.Buffer](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.buffer?view=net-8.0) 属性设置为包含要发送的数据的缓冲区, [SocketAsyncEventArgs.Count](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.count?view=net-8.0) 而 属性需要设置为要从缓冲区发送的数据的字节数。 建立连接后,发送此数据缓冲区。
|
|||
|
|
|
|||
|
|
如果使用面向连接的协议,并且未在调用 [ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0)之前调用 [Bind](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.bind?view=net-8.0) ,则基础服务提供商将分配最合适的本地网络地址和端口号。
|
|||
|
|
|
|||
|
|
如果使用无连接协议,则在你调用 [SendAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.sendasync?view=net-8.0) 或 [ReceiveAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.receiveasync?view=net-8.0) 方法之前,服务提供商不会分配本地网络 IP 地址和端口号。
|
|||
|
|
|
|||
|
|
[ConnectAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket.connectasync?view=net-8.0)如果 和 [SocketAsyncEventArgs.RemoteEndPoint](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketasynceventargs.remoteendpoint?view=net-8.0) 的[Socket](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?view=net-8.0)地址系列不在同一地址系列,则引发 [NotSupportedException](https://learn.microsoft.com/zh-cn/dotnet/api/system.notsupportedexception?view=net-8.0) 方法。
|