Socket.ReceiveFrom Method

Definition

Получает датаграмму и сохраняет конечную точку источника.Receives a datagram and stores the source endpoint.

Overloads

ReceiveFrom(Byte[], EndPoint)

Принимает датаграмму в буфер данных и сохраняет конечную точку.Receives a datagram into the data buffer and stores the endpoint.

ReceiveFrom(Byte[], SocketFlags, EndPoint)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.Receives a datagram into the data buffer, using the specified SocketFlags, and stores the endpoint.

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

Получает указанное число байтов во входной буфер, используя заданный объект SocketFlags, и сохраняет конечную точку.Receives the specified number of bytes into the data buffer, using the specified SocketFlags, and stores the endpoint.

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

Получает указанное число байтов данных в заданном расположении буфера данных с использованием определенного параметра SocketFlags и сохраняет конечную точку.Receives the specified number of bytes of data into the specified location of the data buffer, using the specified SocketFlags, and stores the endpoint.

ReceiveFrom(Byte[], EndPoint)

Принимает датаграмму в буфер данных и сохраняет конечную точку.Receives a datagram into the data buffer and stores the 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

Parameters

buffer
Byte[]

Массив объекта типа Byte, который является местом хранения полученных данных.An array of type Byte that is the storage location for received data.

remoteEP
EndPoint

Переданный по ссылке объект EndPoint, представляющий удаленный сервер.An EndPoint, passed by reference, that represents the remote server.

Returns

Int32

Количество полученных байтов.The number of bytes received.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

Socket был закрыт.The Socket has been closed.

Вызывающий оператор в стеке вызовов не имеет необходимых разрешений.A caller in the call stack does not have the required permissions.

Examples

Следующий пример кода получает датаграмму без подключения от удаленного узла.The following code example receives a connectionless datagram from a remote host.

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

Remarks

Метод ReceiveFrom считывает данные в параметре buffer, возвращает число успешно считанных байтов и фиксирует конечную точку удаленного узла, из которой были отправлены данные.The ReceiveFrom method reads data into the buffer parameter, returns the number of bytes successfully read, and captures the remote host endpoint from which the data was sent. Этот метод полезен, если вы собираетесь принимать неподключенные датаграммы с неизвестного узла или с нескольких узлов.This method is useful if you intend to receive connectionless datagrams from an unknown host or multiple hosts.

Эта перегрузка требует только предоставления bufferполучения и EndPoint, представляющей удаленный узел.This overload only requires you to provide a receive buffer, and an EndPoint that represents the remote host. По умолчанию смещение буфера равно 0.The buffer offset defaults to 0. Размер по умолчанию равен длине параметра buffer, а socketFlags значение по умолчанию — None.The size defaults to the length of the buffer parameter and the socketFlags value defaults to None.

Note

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью метода Bind.Before calling ReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method. В противном случае ReceiveFrom выдаст SocketException.If you do not, ReceiveFrom will throw a SocketException.

При использовании протоколов без подключения ReceiveFrom будет считывать первые поставленные в очередь датаграммы, полученные в буфер локальной сети.With connectionless protocols, ReceiveFrom will read the first enqueued datagram received into the local network buffer. Если полученная датаграмма превышает размер buffer, метод ReceiveFrom будет заполняться buffer с максимально возможной частью сообщения и вызывать SocketException.If the datagram you receive is larger than the size of buffer, the ReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. При использовании ненадежного протокола избыточные данные будут потеряны.If you are using an unreliable protocol, the excess data will be lost. Если используется надежный протокол, избыточные данные будут сохранены поставщиком услуг, и его можно будет извлечь, вызвав метод ReceiveFrom с достаточно большим буфером.If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the ReceiveFrom method with a large enough buffer.

Если данные для чтения недоступны, метод ReceiveFrom будет блокироваться до тех пор, пока данные недоступны.If no data is available for reading, the ReceiveFrom method will block until data is available. Если вы используете режим без блокировки и в буфере стека протоколов нет доступных данных, метод ReceiveFrom будет завершен немедленно и выдаст SocketException.If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the ReceiveFrom method will complete immediately and throw a SocketException. Чтобы определить, доступны ли данные для чтения, можно использовать свойство Available.You can use the Available property to determine if data is available for reading. Если Available не равно нулю, повторите операцию получения.When Available is non-zero, retry the receive operation.

Хотя ReceiveFrom предназначен для протоколов без подключения, также можно использовать протокол, ориентированный на соединение.Although ReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. Если вы решили это сделать, необходимо сначала установить соединение с удаленным узлом, вызвав метод Connect или добавив входящее подключение к удаленному узлу, вызвав метод Accept.If you choose to do so, you must first either establish a remote host connection by calling the Connect method or accept an incoming remote host connection by calling the Accept method. Если не установить или не принять подключение перед вызовом метода ReceiveFrom, будет получен SocketException.If you do not establish or accept a connection before calling the ReceiveFrom method, you will get a SocketException. Кроме того, можно установить удаленный узел по умолчанию для протокола без установления соединения перед вызовом метода ReceiveFrom.You can also establish a default remote host for a connectionless protocol prior to calling the ReceiveFrom method. В любом из этих случаев метод ReceiveFrom будет игнорировать параметр remoteEP и получить данные только с подключенного или удаленного узла по умолчанию.In either of these cases, the ReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

При использовании сокетов, ориентированных на соединение, ReceiveFrom будет считывать столько данных, сколько доступно до размера buffer.With connection-oriented sockets, ReceiveFrom will read as much data as is available up to the size of buffer. Если удаленный узел завершает подключение Socket с помощью метода Shutdown и получены все доступные данные, метод ReceiveFrom будет завершен немедленно и возвращать нулевые байты.If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the ReceiveFrom method will complete immediately and return zero bytes.

Note

Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

AddressFamily EndPoint, используемых в ReceiveFrom, должны соответствовать AddressFamily EndPoint, используемого в SendTo.The AddressFamily of the EndPoint used in ReceiveFrom needs to match the AddressFamily of the EndPoint used in SendTo.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

See also

ReceiveFrom(Byte[], SocketFlags, EndPoint)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.Receives a datagram into the data buffer, using the specified SocketFlags, and stores the endpoint.

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

Parameters

buffer
Byte[]

Массив типа Byte, который является местоположением памяти для полученных данных.An array of type Byte that is the storage location for the received data.

socketFlags
SocketFlags

Побитовое сочетание значений SocketFlags.A bitwise combination of the SocketFlags values.

remoteEP
EndPoint

Переданный по ссылке объект EndPoint, представляющий удаленный сервер.An EndPoint, passed by reference, that represents the remote server.

Returns

Int32

Количество полученных байтов.The number of bytes received.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

Socket был закрыт.The Socket has been closed.

Вызывающий оператор в стеке вызовов не имеет необходимых разрешений.A caller in the call stack does not have the required permissions.

Examples

Следующий пример кода получает датаграмму без подключения от удаленного узла.The following code example receives a connectionless datagram from a remote host. SocketFlags передаются методу ReceiveFrom.SocketFlags are passed to the ReceiveFrom method.

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

Remarks

Метод ReceiveFrom считывает данные в параметре buffer, возвращает число успешно считанных байтов и фиксирует конечную точку удаленного узла, из которой были отправлены данные.The ReceiveFrom method reads data into the buffer parameter, returns the number of bytes successfully read, and captures the remote host endpoint from which the data was sent. Этот метод полезен, если вы собираетесь принимать неподключенные датаграммы с неизвестного узла или с нескольких узлов.This method is useful if you intend to receive connectionless datagrams from an unknown host or multiple hosts.

Эта перегрузка требует только предоставления приемного буфера, необходимого SocketFlagsи EndPoint, представляющего удаленный узел.This overload only requires you to provide a receive buffer, the necessary SocketFlags, and an EndPoint that represents the remote host. Смещение по умолчанию равно 0, а размер по умолчанию равен длине параметра buffer.The offset defaults to 0 and the size defaults to the length of the buffer parameter.

Note

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью метода Bind.Before calling ReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method. В противном случае ReceiveFrom выдаст SocketException.If you do not, ReceiveFrom will throw a SocketException.

При использовании протоколов без подключения ReceiveFrom будет считывать первые поставленные в очередь датаграммы, полученные в буфер локальной сети.With connectionless protocols, ReceiveFrom will read the first enqueued datagram received into the local network buffer. Если полученная датаграмма превышает размер buffer, метод ReceiveFrom будет заполняться buffer с максимально возможной частью сообщения и вызывать SocketException.If the datagram you receive is larger than the size of buffer, the ReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. При использовании ненадежного протокола избыточные данные будут потеряны.If you are using an unreliable protocol, the excess data will be lost. Если используется надежный протокол, избыточные данные будут сохранены поставщиком услуг, и его можно будет извлечь, вызвав метод ReceiveFrom с достаточно большим буфером.If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the ReceiveFrom method with a large enough buffer.

Если данные для чтения недоступны, метод ReceiveFrom будет блокироваться до тех пор, пока данные недоступны.If no data is available for reading, the ReceiveFrom method will block until data is available. Если вы используете режим без блокировки и в буфере стека протоколов нет доступных данных, метод ReceiveFrom будет завершен немедленно и выдаст SocketException.If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the ReceiveFrom method will complete immediately and throw a SocketException. Чтобы определить, доступны ли данные для чтения, можно использовать свойство Available.You can use the Available property to determine if data is available for reading. Если Available не равно нулю, повторите операцию получения.When Available is non-zero, retry the receive operation.

Хотя ReceiveFrom предназначен для протоколов без подключения, также можно использовать протокол, ориентированный на соединение.Although ReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. Если вы решили это сделать, необходимо сначала установить соединение с удаленным узлом, вызвав метод Connect или добавив входящее подключение к удаленному узлу, вызвав метод Accept.If you choose to do so, you must first either establish a remote host connection by calling the Connect method or accept an incoming remote host connection by calling the Accept method. Если не установить или не принять подключение перед вызовом метода ReceiveFrom, будет получен SocketException.If you do not establish or accept a connection before calling the ReceiveFrom method, you will get a SocketException. Кроме того, можно установить удаленный узел по умолчанию для протокола без установления соединения перед вызовом метода ReceiveFrom.You can also establish a default remote host for a connectionless protocol prior to calling the ReceiveFrom method. В любом из этих случаев метод ReceiveFrom будет игнорировать параметр remoteEP и получить данные только с подключенного или удаленного узла по умолчанию.In either of these cases, the ReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

При использовании сокетов, ориентированных на соединение, ReceiveFrom будет считывать столько данных, сколько доступно до размера buffer.With connection-oriented sockets, ReceiveFrom will read as much data as is available up to the size of buffer. Если удаленный узел завершает подключение Socket с помощью метода Shutdown и получены все доступные данные, метод ReceiveFrom будет завершен немедленно и возвращать нулевые байты.If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been Received, the ReceiveFrom method will complete immediately and return zero bytes.

Note

Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

AddressFamily EndPoint, используемых в ReceiveFrom, должны соответствовать AddressFamily EndPoint, используемого в SendTo.The AddressFamily of the EndPoint used in ReceiveFrom needs to match the AddressFamily of the EndPoint used in SendTo.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

See also

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

Получает указанное число байтов во входной буфер, используя заданный объект SocketFlags, и сохраняет конечную точку.Receives the specified number of bytes into the data buffer, using the specified SocketFlags, and stores the endpoint.

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

Parameters

buffer
Byte[]

Массив объекта типа Byte, который является местом хранения полученных данных.An array of type Byte that is the storage location for received data.

size
Int32

Количество байтов, которые необходимо получить.The number of bytes to receive.

socketFlags
SocketFlags

Побитовое сочетание значений SocketFlags.A bitwise combination of the SocketFlags values.

remoteEP
EndPoint

Переданный по ссылке объект EndPoint, представляющий удаленный сервер.An EndPoint, passed by reference, that represents the remote server.

Returns

Int32

Количество полученных байтов.The number of bytes received.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Значение параметра size меньше 0.size is less than 0.

-или--or- Значение size превышает длину buffer.size is greater than the length of buffer.

socketFlags — недопустимое сочетание значений.socketFlags is not a valid combination of values.

-или--or- Свойство LocalEndPoint не задано.The LocalEndPoint property was not set.

-или--or- Произошла ошибка операционной системы при доступе к Socket.An operating system error occurs while accessing the Socket.

Socket был закрыт.The Socket has been closed.

Вызывающий оператор в стеке вызовов не имеет необходимых разрешений.A caller in the call stack does not have the required permissions.

Examples

Следующий пример кода получает датаграмму без подключения от удаленного узла.The following code example receives a connectionless datagram from a remote host. Размер буфера и SocketFlags передаются методу ReceiveFrom.The buffer size, and SocketFlags are passed to the ReceiveFrom method.

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

Remarks

Метод ReceiveFrom считывает данные в параметре buffer, возвращает число успешно считанных байтов и фиксирует конечную точку удаленного узла, из которой были отправлены данные.The ReceiveFrom method reads data into the buffer parameter, returns the number of bytes successfully read, and captures the remote host endpoint from which the data was sent. Этот метод полезен, если вы собираетесь принимать неподключенные датаграммы с неизвестного узла или с нескольких узлов.This method is useful if you intend to receive connectionless datagrams from an unknown host or multiple hosts.

Эта перегрузка требует только предоставления буфера приема, числа принимаемых байтов, необходимого SocketFlagsи EndPoint, представляющего удаленный узел.This overload only requires you to provide a receive buffer, the number of bytes you want to receive, the necessary SocketFlags, and an EndPoint that represents the remote host. По умолчанию смещение буфера равно 0.The buffer offset defaults to 0.

При использовании протоколов без подключения ReceiveFrom будет считывать первые поставленные в очередь датаграммы, полученные в буфер локальной сети.With connectionless protocols, ReceiveFrom will read the first enqueued datagram received into the local network buffer. Если полученная датаграмма превышает размер buffer, метод ReceiveFrom будет заполняться buffer с максимально возможной частью сообщения и вызывать SocketException.If the datagram you receive is larger than the size of buffer, the ReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. При использовании ненадежного протокола избыточные данные будут потеряны.If you are using an unreliable protocol, the excess data will be lost. Если используется надежный протокол, избыточные данные будут сохранены поставщиком услуг, и его можно будет извлечь, вызвав метод ReceiveFrom с достаточно большим буфером.If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the ReceiveFrom method with a large enough buffer.

Если данные для чтения недоступны, метод ReceiveFrom будет блокироваться до тех пор, пока данные недоступны.If no data is available for reading, the ReceiveFrom method will block until data is available. Если вы используете режим без блокировки и в буфере стека протоколов нет доступных данных, метод ReceiveFrom будет завершен немедленно и выдаст SocketException.If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the ReceiveFrom method will complete immediately and throw a SocketException. Чтобы определить, доступны ли данные для чтения, можно использовать свойство Available.You can use the Available property to determine if data is available for reading. Если Available не равно нулю, повторите операцию получения.When Available is non-zero, retry the receive operation.

Хотя ReceiveFrom предназначен для протоколов без подключения, также можно использовать протокол, ориентированный на соединение.Although ReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. Если вы решили это сделать, необходимо сначала установить соединение с удаленным узлом, вызвав метод Connect или добавив входящее подключение к удаленному узлу, вызвав метод Accept.If you choose to do so, you must first either establish a remote host connection by calling the Connect method or accept an incoming remote host connection by calling the Accept method. Если не установить или не принять подключение перед вызовом метода ReceiveFrom, будет получен SocketException.If you do not establish or accept a connection before calling the ReceiveFrom method, you will get a SocketException. Кроме того, можно установить удаленный узел по умолчанию для протокола без установления соединения перед вызовом метода ReceiveFrom.You can also establish a default remote host for a connectionless protocol prior to calling the ReceiveFrom method. В любом из этих случаев метод ReceiveFrom будет игнорировать параметр remoteEP и получить данные только с подключенного или удаленного узла по умолчанию.In either of these cases, the ReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

При использовании сокетов, ориентированных на соединение, ReceiveFrom будет считывать столько данных, сколько доступно до числа байтов, указанного параметром size.With connection-oriented sockets, ReceiveFrom will read as much data as is available up to the number of bytes specified by the size parameter. Если удаленный узел завершает подключение Socket с помощью метода Shutdown и получены все доступные данные, метод ReceiveFrom будет завершен немедленно и возвращать нулевые байты.If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the ReceiveFrom method will complete immediately and return zero bytes.

Note

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью метода Bind.Before calling ReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method. В противном случае ReceiveFrom выдаст SocketException.If you do not, ReceiveFrom will throw a SocketException. Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

AddressFamily EndPoint, используемых в ReceiveFrom, должны соответствовать AddressFamily EndPoint, используемого в SendTo.The AddressFamily of the EndPoint used in ReceiveFrom needs to match the AddressFamily of the EndPoint used in SendTo.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

See also

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

Получает указанное число байтов данных в заданном расположении буфера данных с использованием определенного параметра SocketFlags и сохраняет конечную точку.Receives the specified number of bytes of data into the specified location of the data buffer, using the specified SocketFlags, and stores the endpoint.

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

Parameters

buffer
Byte[]

Массив объекта типа Byte, который является местом хранения полученных данных.An array of type Byte that is the storage location for received data.

offset
Int32

Позиция в параметре buffer для хранения полученных данных.The position in the buffer parameter to store the received data.

size
Int32

Количество байтов, которые необходимо получить.The number of bytes to receive.

socketFlags
SocketFlags

Побитовое сочетание значений SocketFlags.A bitwise combination of the SocketFlags values.

remoteEP
EndPoint

Переданный по ссылке объект EndPoint, представляющий удаленный сервер.An EndPoint, passed by reference, that represents the remote server.

Returns

Int32

Количество полученных байтов.The number of bytes received.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Значение параметра offset меньше 0.offset is less than 0.

-или--or- Значение offset превышает длину buffer.offset is greater than the length of buffer.

-или--or- Значение параметра size меньше 0.size is less than 0.

-или--or- Значение size превышает значение, полученное, если отнять от длины buffer значение параметра смещения.size is greater than the length of the buffer minus the value of the offset parameter.

socketFlags — недопустимое сочетание значений.socketFlags is not a valid combination of values.

-или--or- Свойство LocalEndPoint не задано.The LocalEndPoint property was not set.

-или--or- Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

Socket был закрыт.The Socket has been closed.

Examples

Следующий пример кода получает датаграмму без подключения от удаленного узла.The following code example receives a connectionless datagram from a remote host. Смещение, размер буфера и SocketFlags передаются методу ReceiveFrom.The offset, buffer size, and SocketFlags are passed to the ReceiveFrom method.

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

Remarks

Метод ReceiveFrom считывает данные в параметре buffer, возвращает число успешно считанных байтов и фиксирует конечную точку удаленного узла, из которой были отправлены данные.The ReceiveFrom method reads data into the buffer parameter, returns the number of bytes successfully read, and captures the remote host endpoint from which the data was sent. Этот метод полезен, если вы собираетесь принимать неподключенные датаграммы с неизвестного узла или с нескольких узлов.This method is useful if you intend to receive connectionless datagrams from an unknown host or multiple hosts.

При использовании протоколов без подключения ReceiveFrom будет считывать первые поставленные в очередь датаграммы, полученные в буфер локальной сети.With connectionless protocols, ReceiveFrom will read the first enqueued datagram received into the local network buffer. Если полученная датаграмма превышает размер buffer, метод ReceiveFrom будет заполняться buffer с максимально возможной частью сообщения и вызывать SocketException.If the datagram you receive is larger than the size of buffer, the ReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. При использовании ненадежного протокола избыточные данные будут потеряны.If you are using an unreliable protocol, the excess data will be lost. Если используется надежный протокол, избыточные данные будут сохранены поставщиком услуг, и его можно будет извлечь, вызвав метод ReceiveFrom с достаточно большим буфером.If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the ReceiveFrom method with a large enough buffer.

Если данные для чтения недоступны, метод ReceiveFrom будет блокироваться до тех пор, пока данные недоступны.If no data is available for reading, the ReceiveFrom method will block until data is available. Если вы используете режим без блокировки и в буфере стека протоколов нет доступных данных, метод ReceiveFrom будет завершен немедленно и выдаст SocketException.If you are in non-blocking mode, and there is no data available in the in the protocol stack buffer, the ReceiveFrom method will complete immediately and throw a SocketException. Чтобы определить, доступны ли данные для чтения, можно использовать свойство Available.You can use the Available property to determine if data is available for reading. Если Available не равно нулю, повторите операцию получения.When Available is non-zero, retry the receive operation.

Хотя ReceiveFrom предназначен для протоколов без подключения, также можно использовать протокол, ориентированный на соединение.Although ReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. Если вы решили это сделать, необходимо сначала установить соединение с удаленным узлом, вызвав метод Connect или добавив входящее подключение к удаленному узлу, вызвав метод Accept.If you choose to do so, you must first either establish a remote host connection by calling the Connect method or accept an incoming remote host connection by calling the Accept method. Если не установить или не принять подключение перед вызовом метода ReceiveFrom, будет получен SocketException.If you do not establish or accept a connection before calling the ReceiveFrom method, you will get a SocketException. Кроме того, можно установить удаленный узел по умолчанию для протокола без установления соединения перед вызовом метода ReceiveFrom.You can also establish a default remote host for a connectionless protocol prior to calling the ReceiveFrom method. В любом из этих случаев метод ReceiveFrom будет игнорировать параметр remoteEP и получить данные только с подключенного или удаленного узла по умолчанию.In either of these cases, the ReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

При использовании сокетов, ориентированных на соединение, ReceiveFrom будет считывать столько данных, сколько доступно в байтах, заданных параметром size.With connection-oriented sockets, ReceiveFrom will read as much data as is available up to the amount of bytes specified by the size parameter. Если удаленный узел завершает подключение Socket с помощью метода Shutdown и получены все доступные данные, метод ReceiveFrom будет завершен немедленно и возвращать нулевые байты.If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been Received, the ReceiveFrom method will complete immediately and return zero bytes.

Note

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью метода Bind.Before calling ReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method. В противном случае ReceiveFrom выдаст SocketException.If you do not, ReceiveFrom will throw a SocketException. Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

AddressFamily EndPoint, используемых в ReceiveFrom, должны соответствовать AddressFamily EndPoint, используемого в SendTo.The AddressFamily of the EndPoint used in ReceiveFrom needs to match the AddressFamily of the EndPoint used in SendTo.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

See also

Applies to