Socket.BeginReceiveFrom 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
开始从指定网络设备中异步接收数据。
public:
IAsyncResult ^ BeginReceiveFrom(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback? callback, object? state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback callback, object state);
member this.BeginReceiveFrom : byte[] * int * int * System.Net.Sockets.SocketFlags * EndPoint * AsyncCallback * obj -> IAsyncResult
Public Function BeginReceiveFrom (buffer As Byte(), offset As Integer, size As Integer, socketFlags As SocketFlags, ByRef remoteEP As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult
参数
- offset
- Int32
buffer
参数中存储数据的位置,该位置从零开始计数。
- size
- Int32
要接收的字节数。
- socketFlags
- SocketFlags
SocketFlags 值的按位组合。
- callback
- AsyncCallback
AsyncCallback 委托。
- state
- Object
包含此请求的状态信息的对象。
返回
引用异步读的 IAsyncResult。
例外
仅.NET Framework和 .NET 5 及更早版本:尝试访问套接字时出错。
offset
小于 0。
或
offset
大于 buffer
的长度。
或
size
小于 0。
- 或 -
size
大于 buffer
的长度减去 offset
参数的值。
调用堆栈中的较高调用方无权执行所请求的操作。
注解
重要
这是一个兼容性 API。 不建议使用 APM (Begin*
和 End*
) 方法进行新开发。 请改用 Task
基于 的等效项。
可以将实现的AsyncCallbackBeginReceiveFrom回调传递给 ,以获取有关操作完成的通知。 请注意,如果基础网络堆栈同步完成操作,将在调用 BeginReceiveFrom期间内联执行回调。 在这种情况下, CompletedSynchronously 返回 IAsyncResult 的 上的 属性将设置为 true
以指示该方法同步完成。
AsyncState使用 的 IAsyncResult 属性获取传递给 BeginReceiveFrom 方法的状态对象。
BeginReceiveFrom异步操作必须通过调用 EndReceiveFrom 方法完成。 通常,委托调用 AsyncCallback 方法。 EndReceiveFrom 将阻止调用线程,直到操作完成。
此方法将数据读入 buffer
参数,并捕获从中发送数据的远程主机终结点。 有关如何检索此终结点的信息,请参阅 EndReceiveFrom。 如果要异步接收来自未知主机或多个主机的无连接数据报,此方法最有用。 在这些情况下, BeginReceiveFrom 将读取接收到本地网络缓冲区中的第一个排队数据报。 如果收到的数据报大于 的大小 buffer
,则 BeginReceiveFrom 方法将填充 buffer
尽可能多的消息,并引发 SocketException。 如果使用不可靠的协议,则多余的数据将丢失。 如果使用可靠协议,则服务提供程序将保留多余的数据,可以通过调用 BeginReceiveFrom 具有足够大缓冲区的方法来检索这些数据。
若要保证始终返回远程主机终结点,应用程序应使用 Bind 方法将 显式绑定到Socket本地终结点,然后调用 方法optionLevel
,SetSocketOption并将参数设置为 IP 或 IPv6 (optionName
如果适当)将 PacketInformation参数设置为 ,并在optionValue
调用 BeginReceiveFrom 方法之前调用 参数以启用此选项。 否则,当发送方在接收方调用 BeginReceiveFrom 方法之前发送了许多数据报时,可能会不返回远程主机终结点。
虽然 BeginReceiveFrom 适用于无连接协议,但也可以使用面向连接的协议。 如果选择这样做,必须先通过调用 Connect / BeginConnect 方法建立远程主机连接,或通过调用 Accept 或 BeginAccept 方法接受传入的连接请求。 如果在建立或接受连接之前调用 BeginReceiveFrom 方法,将获得 SocketException。 在调用 BeginReceiveFrom 方法之前,还可以为无连接协议建立默认远程主机。
参数remoteEp
使用面向连接的套接字时, BeginReceiveFrom 将读取尽可能多的数据,最多可以读取 size
参数指定的字节数。
若要取消挂起 BeginReceiveFrom的 ,请调用 Close 方法。
注意
如果收到 , SocketException请使用 SocketException.ErrorCode 属性获取特定的错误代码。
备注
当你在应用程序中启用网络跟踪后,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework 中的网络跟踪。
注意
为异步 Socket 方法缓存 (安全上下文、模拟用户和调用上下文) 的执行上下文。 第一次使用特定上下文 (特定异步 Socket 方法、特定 Socket 实例和特定回调) 后,该上下文的后续使用将提高性能。