Socket.ReceiveFrom Метод

Определение

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

Перегрузки

ReceiveFrom(Byte[], EndPoint)

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

ReceiveFrom(Span<Byte>, EndPoint)

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

ReceiveFrom(Byte[], SocketFlags, EndPoint)

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

ReceiveFrom(Span<Byte>, SocketFlags, EndPoint)

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

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

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

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

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

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

Эта перегрузка требует только предоставления метода Receive 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.

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

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

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

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

Исключения

ремотип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, а размер по умолчанию равен длине параметра buffer.

Примечание

Перед вызовом 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>, 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

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

Исключения

ремотипnull .

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

Socket был закрыт.

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

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.

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

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