Socket.ReceiveFrom 方法

定义

接收数据报并存储源终结点。

重载

ReceiveFrom(Byte[], Int32, SocketFlags, EndPoint)

使用指定的 SocketFlags 将指定的字节数接收到数据缓冲区并存储终结点。

ReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint)

使用指定的 SocketFlags 将指定的数据字节数接收到数据缓冲区的指定位置,并存储终结点。

ReceiveFrom(Span<Byte>, SocketFlags, EndPoint)

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

ReceiveFrom(Byte[], SocketFlags, EndPoint)

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

ReceiveFrom(Span<Byte>, SocketFlags, SocketAddress)

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

ReceiveFrom(Span<Byte>, EndPoint)

将数据报接收到数据缓冲区并存储终结点。

ReceiveFrom(Byte[], EndPoint)

将数据报接收到数据缓冲区并存储终结点。

ReceiveFrom(Byte[], Int32, SocketFlags, EndPoint)

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

使用指定的 SocketFlags 将指定的字节数接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(cli::array <System::Byte> ^ buffer, int size, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (byte[] buffer, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : byte[] * int * System.Net.Sockets.SocketFlags * EndPoint -> int
Public Function ReceiveFrom (buffer As Byte(), size As Integer, socketFlags As SocketFlags, ByRef remoteEP As EndPoint) As Integer

参数

buffer
Byte[]

类型 Byte 的数组,它是所接受的数据的存储位置。

size
Int32

要接收的字节数。

socketFlags
SocketFlags

SocketFlags 值的按位组合。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

buffernull

remoteEPnull

size 小于 0。

size 大于 buffer的长度。

socketFlags 不是有效的值组合。

- 或 -

未设置 LocalEndPoint 属性。

- 或 -

访问 Socket 时出现操作系统错误。

调用堆栈中的调用方没有所需的权限。

示例

下面的代码示例从远程主机接收无连接数据报。 缓冲区大小 和 SocketFlagsReceiveFrom 传递给 方法。

static void ReceiveFrom3()
{
   IPHostEntry^ hostEntry = Dns::Resolve( Dns::GetHostName() );
   IPEndPoint^ endPoint = gcnew IPEndPoint( hostEntry->AddressList[ 0 ],11000 );

   Socket^ s = gcnew Socket( endPoint->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp );
   
   // Creates an IPEndPoint to capture the identity of the sending host.
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
   EndPoint^ senderRemote = safe_cast<EndPoint^>(sender);
   
   // Binding is required with ReceiveFrom calls.
   s->Bind( endPoint );

   array<Byte>^ msg = gcnew array<Byte>(256);
   Console::WriteLine(  "SWaiting to receive datagrams from client..." );
   // This call blocks. 
   s->ReceiveFrom( msg, msg->Length, SocketFlags::None, senderRemote );
   s->Close();
}
public static void ReceiveFrom3()
{
    IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
    IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);

    // Creates an IPEndPoint to capture the identity of the sending host.
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;

    // Binding is required with ReceiveFrom calls.
    s.Bind(endPoint);

    byte[] msg = new Byte[256];
    Console.WriteLine("Waiting to receive datagrams from client...");
    // This call blocks.
    s.ReceiveFrom(msg, msg.Length, SocketFlags.None, ref senderRemote);
    s.Close();
}
Public Shared Sub ReceiveFrom3() 
    Dim hostEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
    Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
    
    Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
    
    ' Creates an IPEndPoint to capture the identity of the sending host.
    Dim sender As New IPEndPoint(IPAddress.Any, 0)
    Dim senderRemote As EndPoint = CType(sender, EndPoint)
    
    ' Binding is required with ReceiveFrom calls.
    s.Bind(endPoint)
    
    Dim msg() As Byte = New [Byte](255) {}
    Console.WriteLine("Waiting to receive datagrams from client...")
    ' This call blocks. 
    s.ReceiveFrom(msg, msg.Length, SocketFlags.None, senderRemote)
    s.Close()

End Sub

注解

方法 ReceiveFrom 将数据读入 buffer 参数,返回成功读取的字节数,并捕获从中发送数据的远程主机终结点。 如果要从未知主机或多个主机接收无连接数据报,此方法非常有用。

此重载只需提供接收缓冲区、要接收的字节数、必要的 SocketFlags以及 EndPoint 表示远程主机的 。 缓冲区偏移量默认为 0。

使用无连接协议时, ReceiveFrom 会将接收到的第一个排队数据报读取到本地网络缓冲区中。 如果收到的数据报大于 的大小 buffer,该方法 ReceiveFrom 将尽可能多地填充 buffer 消息,并引发 SocketException。 如果使用不可靠的协议,则多余的数据将丢失。 如果使用可靠的协议,则服务提供程序将保留多余的数据,可以通过调用 ReceiveFrom 具有足够大缓冲区的方法来检索这些数据。

如果没有可用于读取的数据,则 ReceiveFrom 方法将阻塞,直到数据可用。 如果处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 ReceiveFrom 方法将立即完成并引发 SocketException。 可以使用 Available 属性来确定数据是否可用于读取。 如果 Available 为非零,请重试接收操作。

虽然 ReceiveFrom 适用于无连接协议,但也可以使用面向连接的协议。 如果选择这样做,则必须先通过调用 方法建立远程主机连接,或通过调用 ConnectAccept 方法接受传入的远程主机连接。 如果在调用 ReceiveFrom 方法之前未建立或接受连接,则会收到 SocketException。 在调用 ReceiveFrom 方法之前,还可以为无连接协议建立默认远程主机。

使用面向连接的套接字, ReceiveFrom 将读取最多参数 size 指定的字节数的可用数据。 如果远程主机关闭 Socket 了与 Shutdown 方法的连接,并且已收到所有可用数据,则 ReceiveFrom 该方法将立即完成并返回零个字节。

注意

在调用 ReceiveFrom之前,必须使用 方法将 显式绑定到 Socket 本地终结点 Bind 。 如果不这样做, ReceiveFrom 将引发 SocketException。 如果收到 , SocketException请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,请参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。

注意

AddressFamilyReceiveFrom所用 的 EndPoint 需要与 中SendTo所用 的EndPoint匹配AddressFamily

备注

当你在应用程序中启用网络跟踪后,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework 中的网络跟踪

另请参阅

适用于

ReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint)

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

使用指定的 SocketFlags 将指定的数据字节数接收到数据缓冲区的指定位置,并存储终结点。

public:
 int ReceiveFrom(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : byte[] * int * int * System.Net.Sockets.SocketFlags * EndPoint -> int
Public Function ReceiveFrom (buffer As Byte(), offset As Integer, size As Integer, socketFlags As SocketFlags, ByRef remoteEP As EndPoint) As Integer

参数

buffer
Byte[]

类型 Byte 的数组,它是所接受的数据的存储位置。

offset
Int32

buffer 参数中的位置,用于存储所接收的数据。

size
Int32

要接收的字节数。

socketFlags
SocketFlags

SocketFlags 值的按位组合。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

buffernull

remoteEPnull

offset 小于 0。

offset 大于 buffer 的长度。

size 小于 0。

- 或 -

size 大于 buffer 的长度减去偏移量参数的值。

socketFlags 不是有效的值组合。

- 或 -

未设置 LocalEndPoint 属性。

- 或 -

尝试访问套接字时出错。

示例

下面的代码示例从远程主机接收无连接数据报。 偏移量、缓冲区大小 和 SocketFlagsReceiveFrom 传递给 方法。

static void ReceiveFrom4()
{
   IPHostEntry^ hostEntry = Dns::Resolve( Dns::GetHostName() );
   IPEndPoint^ endPoint = gcnew IPEndPoint( hostEntry->AddressList[ 0 ],11000 );

   Socket^ s = gcnew Socket( endPoint->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp );
   
   // Creates an IpEndPoint to capture the identity of the sending host.
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
   EndPoint^ senderRemote = safe_cast<EndPoint^>(sender);
   
   // Binding is required with ReceiveFrom calls.
   s->Bind( endPoint );

   array<Byte>^ msg = gcnew array<Byte>(256);
   Console::WriteLine(  "SWaiting to receive datagrams from client..." );
   // This call blocks.  
   s->ReceiveFrom( msg, 0, msg->Length, SocketFlags::None, senderRemote );
   s->Close();
}
public static void ReceiveFrom4()
{
    IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
    IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);

    // Creates an IpEndPoint to capture the identity of the sending host.
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;

    // Binding is required with ReceiveFrom calls.
    s.Bind(endPoint);
    byte[] msg = new Byte[256];
    Console.WriteLine("Waiting to receive datagrams from client...");
    // This call blocks.
    s.ReceiveFrom(msg, 0, msg.Length, SocketFlags.None, ref senderRemote);
    s.Close();
}
Public Shared Sub ReceiveFrom4() 
    Dim hostEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
    Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
    
    Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
    
    ' Creates an IpEndPoint to capture the identity of the sending host.
    Dim sender As New IPEndPoint(IPAddress.Any, 0)
    Dim senderRemote As EndPoint = CType(sender, EndPoint)
    
    ' Binding is required with ReceiveFrom calls.
    s.Bind(endPoint)
    Dim msg() As Byte = New [Byte](255) {}
    Console.WriteLine("Waiting to receive datagrams from client...")
    ' This call blocks.  
    s.ReceiveFrom(msg, 0, msg.Length, SocketFlags.None, senderRemote)
    s.Close()

End Sub

注解

方法 ReceiveFrom 将数据读入 buffer 参数,返回成功读取的字节数,并捕获从中发送数据的远程主机终结点。 如果要从未知主机或多个主机接收无连接数据报,此方法非常有用。

使用无连接协议时, ReceiveFrom 会将接收到的第一个排队数据报读取到本地网络缓冲区中。 如果收到的数据报大于 的大小 buffer,该方法 ReceiveFrom 将尽可能多地填充 buffer 消息,并引发 SocketException。 如果使用不可靠的协议,则多余的数据将丢失。 如果使用可靠的协议,则服务提供程序将保留多余的数据,可以通过调用 ReceiveFrom 具有足够大缓冲区的方法来检索这些数据。

如果没有可用于读取的数据,则 ReceiveFrom 方法将阻塞,直到数据可用。 如果处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 ReceiveFrom 方法将立即完成并引发 SocketException。 可以使用 Available 属性来确定数据是否可用于读取。 如果 Available 为非零,请重试接收操作。

虽然 ReceiveFrom 适用于无连接协议,但也可以使用面向连接的协议。 如果选择这样做,则必须先通过调用 方法建立远程主机连接,或通过调用 ConnectAccept 方法接受传入的远程主机连接。 如果在调用 ReceiveFrom 方法之前未建立或接受连接,则会收到 SocketException。 在调用 ReceiveFrom 方法之前,还可以为无连接协议建立默认远程主机。

使用面向连接的套接字, ReceiveFrom 将读取尽可能多的可用数据,最大为 参数指定的 size 字节量。 如果远程主机关闭 Socket 了与 Shutdown 方法的连接,并且已收到所有可用数据,则 ReceiveFrom 该方法将立即完成并返回零个字节。

注意

在调用 ReceiveFrom之前,必须使用 方法将 显式绑定到 Socket 本地终结点 Bind 。 如果不这样做, ReceiveFrom 将引发 SocketException。 如果收到 , SocketException请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,请参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。

注意

AddressFamilyReceiveFrom所用 的 EndPoint 需要与 中SendTo所用 的EndPoint匹配AddressFamily

备注

当你在应用程序中启用网络跟踪后,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework 中的网络跟踪

另请参阅

适用于

ReceiveFrom(Span<Byte>, SocketFlags, EndPoint)

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

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(Span<System::Byte> buffer, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (Span<byte> buffer, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : Span<byte> * System.Net.Sockets.SocketFlags * EndPoint -> int
Public Function ReceiveFrom (buffer As Span(Of Byte), socketFlags As SocketFlags, ByRef remoteEP As EndPoint) As Integer

参数

buffer
Span<Byte>

作为已接收数据的存储位置的字节范围。

socketFlags
SocketFlags

SocketFlags 值的按位组合。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

remoteEPnull

尝试访问套接字时出错。

适用于

ReceiveFrom(Byte[], SocketFlags, EndPoint)

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

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(cli::array <System::Byte> ^ buffer, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (byte[] buffer, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : byte[] * System.Net.Sockets.SocketFlags * EndPoint -> int
Public Function ReceiveFrom (buffer As Byte(), socketFlags As SocketFlags, ByRef remoteEP As EndPoint) As Integer

参数

buffer
Byte[]

Byte 类型的数组,它是存储接收到的数据的位置。

socketFlags
SocketFlags

SocketFlags 值的按位组合。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

buffernull

remoteEPnull

尝试访问套接字时出错。

调用堆栈中的调用方没有所需的权限。

示例

下面的代码示例从远程主机接收无连接数据报。 SocketFlags 传递给 ReceiveFrom 方法。

static void ReceiveFrom2()
{
   IPHostEntry^ hostEntry = Dns::Resolve( Dns::GetHostName() );
   IPEndPoint^ endPoint = gcnew IPEndPoint( hostEntry->AddressList[ 0 ],11000 );

   Socket^ s = gcnew Socket( endPoint->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp );
   
   // Creates an IpEndPoint to capture the identity of the sending host.
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
   EndPoint^ senderRemote = safe_cast<EndPoint^>(sender);
   
   // Binding is required with ReceiveFrom calls.
   s->Bind( endPoint );

   array<Byte>^ msg = gcnew array<Byte>(256);
   Console::WriteLine( "Waiting to receive datagrams from client..." );
   // This call blocks. 
   s->ReceiveFrom( msg, SocketFlags::None, senderRemote );
   s->Close();
}
public static void ReceiveFrom2()
{
    IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
    IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);

    // Creates an IpEndPoint to capture the identity of the sending host.
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;

    // Binding is required with ReceiveFrom calls.
    s.Bind(endPoint);

    byte[] msg = new Byte[256];
    Console.WriteLine("Waiting to receive datagrams from client...");
    // This call blocks.
    s.ReceiveFrom(msg, SocketFlags.None, ref senderRemote);
    s.Close();
}
Public Shared Sub ReceiveFrom2() 
    Dim hostEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
    Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
    
    Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
    
    ' Creates an IpEndPoint to capture the identity of the sending host.
    Dim sender As New IPEndPoint(IPAddress.Any, 0)
    Dim senderRemote As EndPoint = CType(sender, EndPoint)
    
    ' Binding is required with ReceiveFrom calls.
    s.Bind(endPoint)
    
    Dim msg() As Byte = New [Byte](255) {}
    Console.WriteLine("Waiting to receive datagrams from client...")
    ' This call blocks. 
    s.ReceiveFrom(msg, SocketFlags.None, senderRemote)
    s.Close()

End Sub

注解

方法 ReceiveFrom 将数据读入 buffer 参数,返回成功读取的字节数,并捕获从中发送数据的远程主机终结点。 如果要从未知主机或多个主机接收无连接数据报,此方法非常有用。

此重载只需要提供接收缓冲区、必需的 SocketFlagsEndPoint 表示远程主机的 。 偏移量默认为 0,大小默认为缓冲区参数的长度。

注意

在调用 ReceiveFrom之前,必须使用 方法将 显式绑定到 Socket 本地终结点 Bind 。 如果不这样做, ReceiveFrom 将引发 SocketException

使用无连接协议时, ReceiveFrom 会将接收到的第一个排队数据报读取到本地网络缓冲区中。 如果收到的数据报大于 的大小 buffer,该方法 ReceiveFrom 将尽可能多地填充 buffer 消息,并引发 SocketException。 如果使用不可靠的协议,则多余的数据将丢失。 如果使用可靠的协议,则服务提供程序将保留多余的数据,可以通过调用 ReceiveFrom 具有足够大缓冲区的方法来检索这些数据。

如果没有可用于读取的数据,则 ReceiveFrom 方法将阻塞,直到数据可用。 如果处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 ReceiveFrom 方法将立即完成并引发 SocketException。 可以使用 Available 属性来确定数据是否可用于读取。 如果 Available 为非零,请重试接收操作。

虽然 ReceiveFrom 适用于无连接协议,但也可以使用面向连接的协议。 如果选择这样做,则必须先通过调用 方法建立远程主机连接,或通过调用 ConnectAccept 方法接受传入的远程主机连接。 如果在调用 ReceiveFrom 方法之前未建立或接受连接,则会收到 SocketException。 在调用 ReceiveFrom 方法之前,还可以为无连接协议建立默认远程主机。

使用面向连接的套接字, ReceiveFrom 将读取最大大小 buffer的数据量。 如果远程主机关闭 Socket 了与 Shutdown 方法的连接,并且已收到所有可用数据,则 ReceiveFrom 该方法将立即完成并返回零个字节。

注意

如果收到 , SocketException请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,请参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。

注意

AddressFamilyReceiveFrom所用 的 EndPoint 需要与 中SendTo所用 的EndPoint匹配AddressFamily

备注

当你在应用程序中启用网络跟踪后,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework 中的网络跟踪

另请参阅

适用于

ReceiveFrom(Span<Byte>, SocketFlags, SocketAddress)

Source:
Socket.cs
Source:
Socket.cs

使用指定的 SocketFlags 将数据报接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(Span<System::Byte> buffer, System::Net::Sockets::SocketFlags socketFlags, System::Net::SocketAddress ^ receivedAddress);
public int ReceiveFrom (Span<byte> buffer, System.Net.Sockets.SocketFlags socketFlags, System.Net.SocketAddress receivedAddress);
member this.ReceiveFrom : Span<byte> * System.Net.Sockets.SocketFlags * System.Net.SocketAddress -> int
Public Function ReceiveFrom (buffer As Span(Of Byte), socketFlags As SocketFlags, receivedAddress As SocketAddress) As Integer

参数

buffer
Span<Byte>

作为已接收数据的存储位置的字节范围。

socketFlags
SocketFlags

SocketFlags 值的按位组合。

receivedAddress
SocketAddress

一个 SocketAddress 实例,在此方法返回时使用远程对等方的值进行更新。

返回

收到的字节数。

例外

receivedAddressnull

尝试访问套接字时出错。

适用于

ReceiveFrom(Span<Byte>, EndPoint)

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

将数据报接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(Span<System::Byte> buffer, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (Span<byte> buffer, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : Span<byte> * EndPoint -> int
Public Function ReceiveFrom (buffer As Span(Of Byte), ByRef remoteEP As EndPoint) As Integer

参数

buffer
Span<Byte>

作为已接收数据的存储位置的字节范围。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

remoteEPnull

尝试访问套接字时出错。

适用于

ReceiveFrom(Byte[], EndPoint)

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

将数据报接收到数据缓冲区并存储终结点。

public:
 int ReceiveFrom(cli::array <System::Byte> ^ buffer, System::Net::EndPoint ^ % remoteEP);
public int ReceiveFrom (byte[] buffer, ref System.Net.EndPoint remoteEP);
member this.ReceiveFrom : byte[] * EndPoint -> int
Public Function ReceiveFrom (buffer As Byte(), ByRef remoteEP As EndPoint) As Integer

参数

buffer
Byte[]

类型 Byte 的数组,它是所接受的数据的存储位置。

remoteEP
EndPoint

EndPoint 类型的引用,该类型与成功接收时要更新的远程主机的终结点相同。

返回

收到的字节数。

例外

buffernull

remoteEPnull

尝试访问套接字时出错。

调用堆栈中的调用方没有所需的权限。

示例

下面的代码示例从远程主机接收无连接数据报。

static void ReceiveFrom1()
{
   IPHostEntry^ hostEntry = Dns::Resolve( Dns::GetHostName() );
   IPEndPoint^ endPoint = gcnew IPEndPoint( hostEntry->AddressList[ 0 ],11000 );

   Socket^ s = gcnew Socket( endPoint->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp );
   
   // Creates an IPEndPoint to capture the identity of the sending host.
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
   EndPoint^ senderRemote = safe_cast<EndPoint^>(sender);
   
   // Binding is required with ReceiveFrom calls.
   s->Bind( endPoint );

   array<Byte>^ msg = gcnew array<Byte>(256);
   Console::WriteLine( "Waiting to receive datagrams from client..." );
   
   // This call blocks. 
   s->ReceiveFrom( msg, senderRemote );
   s->Close();
}
public static void ReceiveFrom1()
{
    IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
    IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);

    // Creates an IPEndPoint to capture the identity of the sending host.
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;

    // Binding is required with ReceiveFrom calls.
    s.Bind(endPoint);

    byte[] msg = new Byte[256];
    Console.WriteLine("Waiting to receive datagrams from client...");

    // This call blocks.
    s.ReceiveFrom(msg, ref senderRemote);
    s.Close();
}
Public Shared Sub ReceiveFrom1() 
    Dim hostEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
    Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
    
    Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
    
    ' Creates an IPEndPoint to capture the identity of the sending host.
    Dim sender As New IPEndPoint(IPAddress.Any, 0)
    Dim senderRemote As EndPoint = CType(sender, EndPoint)
    
    ' Binding is required with ReceiveFrom calls.
    s.Bind(endPoint)
    
    Dim msg() As Byte = New [Byte](255) {}
    Console.WriteLine("Waiting to receive datagrams from client...")
    
    ' This call blocks. 
    s.ReceiveFrom(msg, senderRemote)
    s.Close()

End Sub

注解

方法 ReceiveFrom 将数据读入 buffer 参数,返回成功读取的字节数,并捕获从中发送数据的远程主机终结点。 如果要从未知主机或多个主机接收无连接数据报,此方法非常有用。

此重载只需要提供接收 buffer,以及 EndPoint 表示远程主机的 。 缓冲区偏移量默认为 0。 大小默认为 参数的 buffer 长度, socketFlags 值默认为 None

注意

在调用 ReceiveFrom之前,必须使用 方法将 显式绑定到 Socket 本地终结点 Bind 。 如果不这样做, ReceiveFrom 将引发 SocketException

使用无连接协议时, ReceiveFrom 会将接收到的第一个排队数据报读取到本地网络缓冲区中。 如果收到的数据报大于 的大小 buffer,该方法 ReceiveFrom 将尽可能多地填充 buffer 消息,并引发 SocketException。 如果使用不可靠的协议,则多余的数据将丢失。 如果使用可靠的协议,则服务提供程序将保留多余的数据,可以通过调用 ReceiveFrom 具有足够大缓冲区的方法来检索这些数据。

如果没有可用于读取的数据,则 ReceiveFrom 方法将阻塞,直到数据可用。 如果处于非阻止模式,并且协议堆栈缓冲区中没有可用的数据,则 ReceiveFrom 方法将立即完成并引发 SocketException。 可以使用 Available 属性来确定数据是否可用于读取。 如果 Available 为非零,请重试接收操作。

虽然 ReceiveFrom 适用于无连接协议,但也可以使用面向连接的协议。 如果选择这样做,则必须先通过调用 方法建立远程主机连接,或通过调用 ConnectAccept 方法接受传入的远程主机连接。 如果在调用 ReceiveFrom 方法之前未建立或接受连接,则会收到 SocketException。 在调用 ReceiveFrom 方法之前,还可以为无连接协议建立默认远程主机。

使用面向连接的套接字, ReceiveFrom 将读取最大大小 buffer的数据量。 如果远程主机关闭 Socket 了与 Shutdown 方法的连接,并且已收到所有可用数据,则 ReceiveFrom 该方法将立即完成并返回零个字节。

注意

如果收到 , SocketException请使用 SocketException.ErrorCode 属性获取特定的错误代码。 获取此代码后,请参阅 Windows 套接字版本 2 API 错误代码 文档,获取错误的详细说明。

注意

AddressFamilyReceiveFrom所用 的 EndPoint 需要与 中SendTo所用 的EndPoint匹配AddressFamily

备注

当你在应用程序中启用网络跟踪后,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework 中的网络跟踪

另请参阅

适用于