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>, 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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

buffer имеет значение null.

-или-

remoteEP имеет значение null.

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

-или-

Значениеsize превышает длину buffer.

socketFlags — недопустимое сочетание значений.

-или-

Свойство LocalEndPoint не задано.

-или-

Произошла ошибка операционной системы при доступе к Socket.

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 метод игнорирует remoteEP параметр и получает данные только из подключенного или удаленного узла по умолчанию.

При использовании сокетов, ориентированных на подключение, считывает столько данных, сколько доступно до количества байтов, ReceiveFrom указанных параметром size . Если удаленный узел завершит Socket подключение к методу Shutdown и все доступные данные были получены, ReceiveFrom метод завершится немедленно и возвратит ноль байтов.

Примечание

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью Bind метода. Если вы этого не сделаете, ReceiveFrom вызовет SocketExceptionисключение . При получении SocketExceptionсвойства используйте SocketException.ErrorCode свойство для получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.

Примечание

Используемый AddressFamily EndPoint объект ReceiveFrom должен соответствовать AddressFamily используемому EndPoint в SendTo.

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. Дополнительные сведения см. в разделе "Трассировка сети" в платформа .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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

buffer имеет значение null.

-или-

remoteEP имеет значение null.

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

-или-

Значение offset превышает длину buffer.

-или-

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

-или-

Значение size превышает значение, полученное, если отнять от длины buffer значение параметра смещения.

socketFlags — недопустимое сочетание значений.

-или-

Свойство LocalEndPoint не задано.

-или-

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Примеры

В следующем примере кода получается без подключения датаграмма с удаленного узла. Смещение, размер буфера и 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 метод игнорирует remoteEP параметр и получает данные только из подключенного или удаленного узла по умолчанию.

При использовании сокетов, ориентированных на подключение, считывает столько данных, ReceiveFrom сколько доступно до количества байтов, указанных параметром size . Если удаленный узел завершает Socket подключение к методу Shutdown и все доступные данные получены, ReceiveFrom метод завершается немедленно и возвращает ноль байтов.

Примечание

Перед вызовом ReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью Bind метода. Если вы этого не сделаете, ReceiveFrom вызовет SocketExceptionисключение . При получении SocketExceptionсвойства используйте SocketException.ErrorCode свойство для получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows sockets версии 2, чтобы получить подробное описание ошибки.

Примечание

Используемый AddressFamily EndPoint объект ReceiveFrom должен соответствовать AddressFamily используемому EndPoint в SendTo.

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. Дополнительные сведения см. в разделе "Трассировка сети" в платформа .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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

remoteEP имеет значение null.

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Применяется к

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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

buffer имеет значение null.

-или-

remoteEP имеет значение null.

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Вызывающий оператор в стеке вызовов не имеет необходимых разрешений.

Примеры

В следующем примере кода получается датаграмма без подключения с удаленного узла. 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необходимо явно привязать Socket к локальной конечной точке Bind с помощью метода. Если вы этого не сделаете, ReceiveFrom вызовет SocketException.

При использовании протоколов без подключения считывает первую помещенную в очередь датаграмму, ReceiveFrom полученную в буфер локальной сети. Если полученная датаграмма превышает размер buffer, ReceiveFrom метод заполнит buffer максимально возможное количество сообщений и вызовет исключение SocketException. Если вы используете ненадежный протокол, лишние данные будут потеряны. Если вы используете надежный протокол, лишние данные будут храниться поставщиком услуг, и их можно получить, вызвав ReceiveFrom метод с достаточно большим буфером.

Если данные недоступны для чтения, метод блокируется до тех пор, ReceiveFrom пока не будут доступны данные. Если вы находитесь в режиме без блокировки и в буфере стека протокола отсутствуют данные, ReceiveFrom метод завершится немедленно и вызовет исключение SocketException. Свойство можно использовать для Available определения доступности данных для чтения. Если Available значение не равно нулю, повторите операцию получения.

Хотя ReceiveFrom он предназначен для протоколов без подключения, можно также использовать протокол, ориентированный на подключение. Если вы решили сделать это, сначала необходимо установить подключение к удаленному узлу путем вызова Connect метода или принять входящее подключение к удаленному узлу, вызвав Accept метод. Если вы не устанавливаете или не принимаете подключение перед вызовом ReceiveFrom метода, вы получите значение SocketException. Можно также установить удаленный узел по умолчанию для протокола без подключения перед вызовом ReceiveFrom метода. В любом из этих случаев ReceiveFrom метод будет игнорировать remoteEP параметр и получать данные только от подключенного или удаленного узла по умолчанию.

При использовании сокетов, ориентированных на подключение, будет считывать столько данных, ReceiveFrom сколько доступно до размера buffer. Если удаленный узел завершает Socket подключение к методу Shutdown и все доступные данные получены, ReceiveFrom метод завершается немедленно и возвращает ноль байтов.

Примечание

При получении SocketExceptionсвойства используйте SocketException.ErrorCode свойство для получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows Sockets версии 2, чтобы получить подробное описание ошибки.

Примечание

Используемый AddressFamily EndPoint объект ReceiveFrom должен соответствовать AddressFamily используемомуEndPoint.SendTo

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. Дополнительные сведения см. в разделе "Трассировка сети" в платформа .NET Framework.

См. также раздел

Применяется к

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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

remoteEP имеет значение null.

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Применяется к

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, представляющий удаленный сервер.

Возвращаемое значение

Int32

Количество полученных байтов.

Исключения

buffer имеет значение null.

-или-

remoteEP имеет значение null.

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Вызывающий оператор в стеке вызовов не имеет необходимых разрешений.

Примеры

В следующем примере кода получается датаграмма без подключения с удаленного узла.

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 он предназначен для протоколов без подключения, можно также использовать протокол, ориентированный на подключение. Если вы решили сделать это, сначала необходимо установить подключение к удаленному узлу путем вызова Connect метода или принять входящее подключение к удаленному узлу, вызвав Accept метод. Если вы не устанавливаете или не принимаете подключение перед вызовом ReceiveFrom метода, вы получите значение SocketException. Можно также установить удаленный узел по умолчанию для протокола без подключения перед вызовом ReceiveFrom метода. В любом из этих случаев ReceiveFrom метод будет игнорировать remoteEP параметр и получать данные только от подключенного или удаленного узла по умолчанию.

При использовании сокетов, ориентированных на подключение, будет считывать столько данных, ReceiveFrom сколько доступно до размера buffer. Если удаленный узел завершает Socket подключение к методу Shutdown и получает все доступные данные, ReceiveFrom метод завершается немедленно и возвращает ноль байтов.

Примечание

При получении SocketExceptionсвойства используйте SocketException.ErrorCode свойство для получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API Windows Sockets версии 2, чтобы получить подробное описание ошибки.

Примечание

Используемый AddressFamily EndPoint объект ReceiveFrom должен соответствовать AddressFamily используемомуEndPoint.SendTo

Примечание

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. Дополнительные сведения см. в разделе "Трассировка сети" в платформа .NET Framework.

См. также раздел

Применяется к