Socket.ReceiveFrom Метод

Определение

Получает датаграмму и сохраняет конечную точку источника.

Перегрузки

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

Получает указанное число байтов во входной буфер, используя заданный объект SocketFlags, и сохраняет конечную точку.

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

Получает указанное число байтов данных в заданном расположении буфера данных с использованием определенного параметра SocketFlags и сохраняет конечную точку.

ReceiveFrom(Span<Byte>, SocketFlags, EndPoint)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.

ReceiveFrom(Byte[], SocketFlags, EndPoint)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.

ReceiveFrom(Span<Byte>, SocketFlags, SocketAddress)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.

ReceiveFrom(Span<Byte>, EndPoint)

Принимает датаграмму в буфер данных и сохраняет конечную точку.

ReceiveFrom(Byte[], EndPoint)

Принимает датаграмму в буфер данных и сохраняет конечную точку.

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

Получает указанное число байтов во входной буфер, используя заданный объект SocketFlags, и сохраняет конечную точку.

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

Параметры

buffer
Byte[]

Массив объекта типа Byte, который является местом хранения полученных данных.

size
Int32

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

socketFlags
SocketFlags

Поразрядное сочетание значений SocketFlags.

remoteEP
EndPoint

Ссылка на EndPoint объект того же типа, что и конечная точка удаленного узла, обновляемая при успешном получении.

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

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

Исключения

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

Примечание

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

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

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

Исключения

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

Примечание

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

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

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

Исключения

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 объект того же типа, что и конечная точка удаленного узла, обновляемая при успешном получении.

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

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

Исключения

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 сколько доступно, вплоть до размера buffer. Если удаленный узел завершает Socket подключение к методу Shutdown и все доступные данные получены, ReceiveFrom метод немедленно завершает работу и возвращает ноль байтов.

Примечание

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

Примечание

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

Примечание

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

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

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

ReceiveFrom(Span<Byte>, SocketFlags, SocketAddress)

Принимает датаграмму в буфер данных, используя заданный объект SocketFlags, и сохраняет конечную точку.

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

Параметры

buffer
Span<Byte>

Диапазон байтов, который является местом хранения полученных данных.

socketFlags
SocketFlags

Поразрядное сочетание значений SocketFlags.

receivedAddress
SocketAddress

Экземпляр SocketAddress , который обновляется значением удаленного однорангового узла при возврате этим методом.

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

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

Исключения

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

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

Socket был закрыт.

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

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 объект того же типа, что и конечная точка удаленного узла, обновляемая при успешном получении.

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

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

Исключения

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 объект того же типа, что и конечная точка удаленного узла, обновляемая при успешном получении.

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

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

Исключения

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 сколько доступно, вплоть до размера buffer. Если удаленный узел завершает Socket подключение к методу Shutdown и все доступные данные получены, ReceiveFrom метод немедленно завершает работу и возвращает ноль байтов.

Примечание

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

Примечание

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

Примечание

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

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

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