Socket.BeginReceiveFrom 方法

开始从指定网络设备中异步接收数据。

**命名空间:**System.Net.Sockets
**程序集:**System(在 system.dll 中)

语法

声明
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
用法
Dim instance As Socket
Dim buffer As Byte()
Dim offset As Integer
Dim size As Integer
Dim socketFlags As SocketFlags
Dim remoteEP As EndPoint
Dim callback As AsyncCallback
Dim state As Object
Dim returnValue As IAsyncResult

returnValue = instance.BeginReceiveFrom(buffer, offset, size, socketFlags, remoteEP, callback, state)
public IAsyncResult BeginReceiveFrom (
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    ref EndPoint remoteEP,
    AsyncCallback callback,
    Object state
)
public:
IAsyncResult^ BeginReceiveFrom (
    array<unsigned char>^ buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    EndPoint^% remoteEP, 
    AsyncCallback^ callback, 
    Object^ state
)
public IAsyncResult BeginReceiveFrom (
    byte[] buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    /** @ref */ EndPoint remoteEP, 
    AsyncCallback callback, 
    Object state
)
JScript 不支持通过引用传递值类型参数。

参数

  • buffer
    Byte 类型的数组,它是存储接收到的数据的位置。
  • offset
    buffer 参数中存储数据的位置,该位置从零开始计数。
  • size
    要接收的字节数。
  • remoteEP
    一个 EndPoint,它表示数据的来源。
  • state
    一个对象,它包含此请求的状态信息。

返回值

引用异步读的 IAsyncResult

异常

异常类型 条件

ArgumentNullException

buffer 为 空引用(在 Visual Basic 中为 Nothing)。

- 或 -

remoteEP 为 空引用(在 Visual Basic 中为 Nothing)。

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ArgumentOutOfRangeException

offset 小于 0。

- 或 -

offset 大于 buffer 的长度。

- 或 -

size 小于 0。

- 或 -

size 大于 buffer 的长度减去 offset 参数的值。

ObjectDisposedException

Socket 已关闭。

SecurityException

调用堆栈上部的调用方无权执行所请求的操作。

备注

BeginReceiveFrom 方法启动从远程主机异步读取无连接数据报的操作。调用 BeginReceiveFrom 方法将使您能够在单独的执行线程中接收数据。

您可以创建一个实现 AsyncCallback 委托的回调方法并将它的名称传递给 BeginReceiveFrom 方法。为此,您的 state 参数至少必须包含用于通信的已连接或默认 Socket。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginReceiveFrom 方法。

回调方法应调用 EndReceiveFrom 方法。当应用程序调用 BeginReceiveFrom 时,系统将会使用单独的线程来执行指定的回调方法,并将在 EndReceiveFrom 上一直阻止到 Socket 读取数据或引发异常为止。如果想要在调用 BeginReceiveFrom 方法后使原始线程阻止,请使用 WaitHandle.WaitOne。当需要原始线程继续执行时,请在回调方法中调用 T:System.Threading.ManualResetEvent 的 Set 方法。有关如何编写 callback 方法的其他信息,请参见 Callback 示例

提示

在调用 BeginReceiveFrom 之前,必须使用 Bind 方法显式地将 Socket 绑定到本地终结点,否则 BeginReceiveFrom 将会引发 SocketException

该方法将数据读入 buffer 参数中,并捕获从其发送数据的远程主机终结点。有关如何检索此终结点的信息,请参考 EndReceiveFrom。如果打算从未知主机或多个主机异步接收无连接的数据报,则最适合使用此方法。在这些情况下,BeginReceiveFrom 将会读取本地网络缓冲区接收到的第一个排队数据报。如果您接收到的数据报大于 buffer 的大小,则 BeginReceiveFrom 方法将在 buffer 中尽可能多地填充消息内容,并引发 SocketException。如果您使用的是不可靠协议,多余的数据将会丢失。而如果当前使用的是可靠协议,则服务提供程序将保留多余的数据,而且通过使用一个足够大的缓冲区调用 BeginReceiveFrom 方法来检索这些数据。

虽然 BeginReceiveFrom 是用于无连接协议的,但您同样可以使用面向连接的协议。如果选择这样做,则必须通过调用 Connect / BeginConnect 方法来建立远程主机连接,或者调用 AcceptBeginAccept 方法来接受传入的连接请求。如果在建立连接或接受连接之前就调用了 BeginReceiveFrom 方法,则您将得到 SocketException。您也可以在调用 BeginReceiveFrom 方法之前,为无连接协议建立默认远程主机。在上述任何一种情况下,BeginReceiveFrom 方法都会忽略 remoteEP 参数,并且只从已连接的或默认的远程主机接收数据。

对于面向连接的套接字,BeginReceiveFrom 将读取所有可用的数据,直到达到 size 参数所指定的字节数。

若要取消挂起的 BeginReceiveFrom,请调用 Close 方法。

提示

如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。

提示

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪

提示

执行上下文(安全上下文、模拟用户及调用上下文)会被缓存,以用于 Socket 异步方法。在首次使用一个特定上下文(特定 Socket 异步方法、特定 Socket 实例及特定回调)后,该上下文的后续使用将得到性能改善。

示例

下面的代码示例异步接收来自远程主机的无连接数据报。

   Dim lipa As IPHostEntry = Dns.Resolve("host.contoso.com")
   Dim lep As New IPEndPoint(lipa.AddressList(0), 11000)
   
   Dim s As New Socket(lep.Address.AddressFamily, SocketType.DGram, ProtocolType.Udp)
   
   Dim sender As New IPEndPoint(IPAddress.Any, 0)
   Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)
   s.Connect(sender)
   Try
      While True
         allDone.Reset()
         Dim so2 As New StateObject()
         so2.workSocket = s
         Console.WriteLine("Attempting to Receive data from host.contoso.com")
         
         s.BeginReceiveFrom(so2.buffer, 0, StateObject.BUFFER_SIZE, 0, tempRemoteEP, New AsyncCallback(AddressOf Async_Send_Receive.ReceiveFrom_Callback), so2)
         allDone.WaitOne()
      End While
   Catch e As Exception
      Console.WriteLine(e.ToString())
   End Try
End Sub 'ReceiveFrom
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                                  SocketType.Dgram,
                                     ProtocolType.Udp);
   
   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
   EndPoint tempRemoteEP = (EndPoint)sender;
   s.Connect(sender);
   
   try{
        while(true){
             allDone.Reset();
             StateObject so2 = new StateObject();
             so2.workSocket = s;
             Console.WriteLine("Attempting to Receive data from host.contoso.com");
         
             s.BeginReceiveFrom(so2.buffer, 0, StateObject.BUFFER_SIZE,0, ref tempRemoteEP,
                                   new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so2);    
             allDone.WaitOne();
        }
   }
   catch (Exception e){
        Console.WriteLine(e.ToString());
   }
IPHostEntry^ lipa = Dns::Resolve( "host.contoso.com" );
IPEndPoint^ lep = gcnew IPEndPoint( lipa->AddressList[ 0 ], 11000);

   Socket^ s = gcnew Socket( lep->Address->AddressFamily,
         SocketType::Dgram,
      ProtocolType::Udp);
   
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any, 0 );
   EndPoint^ tempRemoteEP = (EndPoint^)( sender );
   s->Connect( sender );
   
   try{
      while(true){
         allDone->Reset();
         StateObject^ so2 = gcnew StateObject();
             so2->workSocket = s;
             Console::WriteLine( "Attempting to Receive data from host.contoso.com" );
         
             s->BeginReceiveFrom( so2->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None, tempRemoteEP,
            gcnew AsyncCallback( &Async_Send_Receive::ReceiveFrom_Callback), so2);    
             allDone->WaitOne();
        }
   }
   catch ( Exception^ e )
   {
        Console::WriteLine( e );
   }

平台

Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

版本信息

.NET Framework

受以下版本支持:2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:2.0、1.0

请参见

参考

Socket 类
Socket 成员
System.Net.Sockets 命名空间
EndReceiveFrom
AsyncCallback
Bind
Connect
Accept

其他资源

Callback 示例