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)

使用指定的 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 時發生作業系統錯誤。

呼叫堆疊中的呼叫端沒有所需的使用權限。

範例

下列程式碼範例會從遠端主機接收無連接資料包。 緩衝區大小和 SocketFlags 會傳遞至 ReceiveFrom 方法。

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 適用于無連線通訊協定,但您也可以使用面向連線的通訊協定。 如果您選擇這樣做,您必須先呼叫 Connect 方法來建立遠端主機連線,或藉由呼叫 Accept 方法來接受連入遠端主機連線。 如果您在呼叫 ReceiveFrom 方法之前未建立或接受連線,您會收到 SocketException 。 您也可以在呼叫 ReceiveFrom 方法之前,為無連線通訊協定建立預設遠端主機。

使用連接導向通訊端時, ReceiveFrom 會讀取最多參數所 size 指定的位元組數目的資料。 如果遠端主機 Socket 關閉與 Shutdown 方法的連線,而且已收到所有可用的資料,則 ReceiveFrom 方法會立即完成,並傳回零個位元組。

注意

在呼叫 ReceiveFrom 之前,您必須使用 Bind 方法明確地將 系結 Socket 至本機端點。 如果您未這麼做, ReceiveFrom 將會擲回 SocketException 。 如果您收到 SocketException ,請使用 SocketException.ErrorCode 屬性來取得特定的錯誤碼。 取得此程式碼之後,請參閱 Windows Sockets 第 2 版 API 錯誤碼 檔,以取得錯誤的詳細描述。

注意

AddressFamily中所 ReceiveFrom 使用 之 的 EndPoint 必須符合 AddressFamilyEndPointSendTo 所使用的 。

注意

在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤

另請參閱

適用於

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

使用指定的 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 屬性。

-或-

嘗試存取通訊端時發生錯誤。

範例

下列程式碼範例會從遠端主機接收無連接資料包。 位移、緩衝區大小和 SocketFlags 會傳遞至 ReceiveFrom 方法。

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 適用于無連線通訊協定,但您也可以使用面向連線的通訊協定。 如果您選擇這樣做,您必須先呼叫 Connect 方法來建立遠端主機連線,或藉由呼叫 Accept 方法來接受連入遠端主機連線。 如果您在呼叫 ReceiveFrom 方法之前未建立或接受連線,您會收到 SocketException 。 您也可以在呼叫 ReceiveFrom 方法之前,為無連線通訊協定建立預設遠端主機。

使用連接導向通訊端時, ReceiveFrom 會讀取最多參數所 size 指定的位元組數量的資料。 如果遠端主機 Socket 關閉與 Shutdown 方法的連線,而且所有可用的資料都已接收,則 ReceiveFrom 方法會立即完成,並傳回零個位元組。

注意

在呼叫 ReceiveFrom 之前,您必須使用 Bind 方法明確地將 系結 Socket 至本機端點。 如果您未這麼做, ReceiveFrom 將會擲回 SocketException 。 如果您收到 SocketException ,請使用 SocketException.ErrorCode 屬性來取得特定的錯誤碼。 取得此程式碼之後,請參閱 Windows Sockets 第 2 版 API 錯誤碼 檔,以取得錯誤的詳細描述。

注意

AddressFamily中所 ReceiveFrom 使用 之 的 EndPoint 必須符合 AddressFamilyEndPointSendTo 所使用的 。

注意

在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤

另請參閱

適用於

ReceiveFrom(Span<Byte>, SocketFlags, EndPoint)

使用指定的 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)

使用指定的 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 參數、傳回成功讀取的位元組數目,並擷取從中傳送資料的遠端主機端點。 如果您想要從未知主機或多部主機接收無連線資料包,這個方法會很有用。

此多載只需要您提供接收緩衝區、必要的 SocketFlags ,以及 EndPoint 代表遠端主機的 。 位移預設為 0,而大小預設為緩衝區參數的長度。

注意

在呼叫 ReceiveFrom 之前,您必須使用 Bind 方法明確地將 系結 Socket 至本機端點。 如果您未這麼做, ReceiveFrom 將會擲回 SocketException

使用無連線通訊協定時, ReceiveFrom 會將第一個排入佇列的資料包讀取到區域網路緩衝區。 如果您收到的資料包大於 的大小 buffer ,則 ReceiveFrom 方法會盡可能填入 buffer 訊息數目,並擲回 SocketException 。 如果您使用不可靠的通訊協定,則會遺失多餘的資料。 如果您使用可靠的通訊協定,服務提供者會保留多餘的資料,而且您可以藉由呼叫 ReceiveFrom 具有足夠大緩衝區的 方法來擷取資料。

如果沒有資料可供讀取,方法 ReceiveFrom 會封鎖直到資料可用為止。 如果您處於非封鎖模式,而且通訊協定堆疊緩衝區中沒有可用的資料,方法 ReceiveFrom 會立即完成並擲回 SocketException 。 您可以使用 Available 屬性來判斷資料是否可供讀取。 當 為非零時 Available ,請重試接收作業。

雖然 ReceiveFrom 適用于無連線通訊協定,但您也可以使用面向連線的通訊協定。 如果您選擇這樣做,您必須先呼叫 Connect 方法來建立遠端主機連線,或藉由呼叫 Accept 方法來接受連入遠端主機連線。 如果您在呼叫 ReceiveFrom 方法之前未建立或接受連線,您會收到 SocketException 。 您也可以在呼叫 ReceiveFrom 方法之前,為無連線通訊協定建立預設遠端主機。

使用連線導向通訊端時, ReceiveFrom 會讀取最多可用的資料大小 buffer 。 如果遠端主機 Socket 關閉與 Shutdown 方法的連線,而且所有可用的資料都已接收,則 ReceiveFrom 方法會立即完成,並傳回零個位元組。

注意

如果您收到 SocketException ,請使用 SocketException.ErrorCode 屬性來取得特定的錯誤碼。 取得此程式碼之後,請參閱 Windows Sockets 第 2 版 API 錯誤碼 檔,以取得錯誤的詳細描述。

注意

AddressFamily中所 ReceiveFrom 使用 之 的 EndPoint 必須符合 AddressFamilyEndPointSendTo 所使用的 。

注意

在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤

另請參閱

適用於

ReceiveFrom(Span<Byte>, SocketFlags, SocketAddress)

使用指定的 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)

接收資料包至資料緩衝區中,並儲存端點。

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)

接收資料包至資料緩衝區中,並儲存端點。

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 之前,您必須使用 Bind 方法明確地將 系結 Socket 至本機端點。 如果您未這麼做, ReceiveFrom 將會擲回 SocketException

使用無連線通訊協定時, ReceiveFrom 會將第一個排入佇列的資料包讀取到區域網路緩衝區。 如果您收到的資料包大於 的大小 bufferReceiveFrom 則 方法會盡可能填滿 buffer 大部分的訊息,並擲回 SocketException 。 如果您使用不可靠的通訊協定,將會遺失多餘的資料。 如果您使用可靠的通訊協定,服務提供者將會保留多餘的資料,而且您可以藉由呼叫 ReceiveFrom 具有足夠大緩衝區的 方法來擷取資料。

如果沒有資料可供讀取, ReceiveFrom 方法會封鎖直到資料可用為止。 如果您處於非封鎖模式,且通訊協定堆疊緩衝區中沒有可用的資料,方法 ReceiveFrom 會立即完成並擲回 SocketException 。 您可以使用 Available 屬性來判斷資料是否可供讀取。 當 Available 為非零時,請重試接收作業。

雖然 ReceiveFrom 適用于無連線通訊協定,但您也可以使用連線導向通訊協定。 如果您選擇這樣做,您必須先呼叫 Connect 方法來建立遠端主機連線,或藉由呼叫 Accept 方法來接受傳入的遠端主機連線。 如果您在呼叫 ReceiveFrom 方法之前未建立或接受連線,您將會收到 SocketException 。 您也可以在呼叫 ReceiveFrom 方法之前,先建立無連線通訊協定的預設遠端主機。

使用連接導向通訊端時, ReceiveFrom 將會讀取最多可用的資料大小 buffer 。 如果遠端主機關閉 Socket 與 方法的 Shutdown 連線,而且已收到所有可用的資料, ReceiveFrom 則方法會立即完成,並傳回零個位元組。

注意

如果您收到 SocketException ,請使用 SocketException.ErrorCode 屬性來取得特定的錯誤碼。 取得此程式碼之後,請參閱 Windows Sockets 第 2 版 API 錯誤碼 檔,以取得錯誤的詳細描述。

注意

AddressFamilyEndPointReceiveFrom 所使用的 必須符合 EndPointAddressFamilySendTo 所使用的 。

注意

在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤

另請參閱

適用於