Socket.ReceiveFrom 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
接收資料包以及儲存來源端點。
多載
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
參數
- size
- Int32
要接收的位元組數。
- socketFlags
- SocketFlags
SocketFlags 值的位元組合。
傳回
收到的位元組數目。
例外狀況
呼叫堆疊中的呼叫端沒有所需的使用權限。
範例
下列程式碼範例會從遠端主機接收無連接資料包。 緩衝區大小和 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 必須符合 AddressFamilyEndPoint 中 SendTo 所使用的 。
注意
在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤。
另請參閱
- Connect(EndPoint)
- Receive(Byte[], Int32, SocketFlags)
- Available
- Shutdown(SocketShutdown)
- Close()
- SocketFlags
適用於
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
參數
- offset
- Int32
buffer
參數中的位置,可儲存接收的資料。
- size
- Int32
要接收的位元組數。
- socketFlags
- SocketFlags
SocketFlags 值的位元組合。
傳回
收到的位元組數目。
例外狀況
offset
小於 0。
-或-
offset
大於 buffer
的長度。
-或-
size
小於 0。
-或-
size
大於 buffer
的長度減去位移參數的值。
範例
下列程式碼範例會從遠端主機接收無連接資料包。 位移、緩衝區大小和 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 必須符合 AddressFamilyEndPoint 中 SendTo 所使用的 。
注意
在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤。
另請參閱
- Connect(EndPoint)
- Receive(Byte[], Int32, SocketFlags)
- Available
- Shutdown(SocketShutdown)
- Close()
- SocketFlags
適用於
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
參數
- socketFlags
- SocketFlags
SocketFlags 值的位元組合。
傳回
收到的位元組數目。
例外狀況
remoteEP
為 null
。
嘗試存取通訊端時發生錯誤。
適用於
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
參數
- socketFlags
- SocketFlags
SocketFlags 值的位元組合。
傳回
收到的位元組數目。
例外狀況
嘗試存取通訊端時發生錯誤。
呼叫堆疊中的呼叫端沒有所需的使用權限。
範例
下列程式碼範例會從遠端主機接收無連接資料包。 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 必須符合 AddressFamilyEndPoint 中 SendTo 所使用的 。
注意
在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤。
另請參閱
- Connect(EndPoint)
- Receive(Byte[], Int32, SocketFlags)
- Available
- Shutdown(SocketShutdown)
- Close()
- SocketFlags
適用於
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
參數
- socketFlags
- SocketFlags
SocketFlags 值的位元組合。
- receivedAddress
- SocketAddress
實例 SocketAddress ,這個實例會在此方法傳回時,以遠端對等的值進行更新。
傳回
收到的位元組數目。
例外狀況
receivedAddress
為 null
。
嘗試存取通訊端時發生錯誤。
適用於
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
參數
傳回
收到的位元組數目。
例外狀況
remoteEP
為 null
。
嘗試存取通訊端時發生錯誤。
適用於
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
參數
傳回
收到的位元組數目。
例外狀況
嘗試存取通訊端時發生錯誤。
呼叫堆疊中的呼叫端沒有所需的使用權限。
範例
下列程式碼範例會從遠端主機接收無連接資料包。
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 會將第一個排入佇列的資料包讀取到區域網路緩衝區。 如果您收到的資料包大於 的大小 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 錯誤碼 檔,以取得錯誤的詳細描述。
注意
AddressFamilyEndPoint 中 ReceiveFrom 所使用的 必須符合 EndPointAddressFamily 中 SendTo 所使用的 。
注意
在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。 如需詳細資訊,請參閱.NET Framework 中的網路追蹤。
另請參閱
適用於
意見反應
https://aka.ms/ContentUserFeedback。
即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱提交並檢視相關的意見反應