Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

Socket.BeginReceiveFrom (Método)

Comienza a recibir asincrónicamente los datos de un dispositivo de red especificado.

Espacio de nombres:  System.Net.Sockets
Ensamblado:  System (en System.dll)
[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginReceiveFrom(
	byte[] buffer,
	int offset,
	int size,
	SocketFlags socketFlags,
	ref EndPoint remoteEP,
	AsyncCallback callback,
	Object state
)

Parámetros

buffer
Tipo: System.Byte[]
Matriz de tipo Byte que constituye la ubicación de almacenamiento de los datos recibidos.
offset
Tipo: System.Int32
Posición de base cero del parámetro buffer donde se almacenarán los datos.
size
Tipo: System.Int32
Número de bytes que se van a recibir.
socketFlags
Tipo: System.Net.Sockets.SocketFlags
Combinación bit a bit de los valores de SocketFlags.
remoteEP
Tipo: System.Net.EndPoint
EndPoint que representa el origen de los datos.
callback
Tipo: System.AsyncCallback
Delegado AsyncCallback.
state
Tipo: System.Object
Objeto que contiene información de estado para esta solicitud.

Valor devuelto

Tipo: System.IAsyncResult
IAsyncResult que hace referencia a la lectura asincrónica.
ExcepciónCondición
ArgumentNullException

buffer es null.

O bien

remoteEP es null.

SocketException

Se ha producido un error al intentar obtener acceso al socket. Vea la sección Comentarios para obtener más información.

ArgumentOutOfRangeException

offset es menor que 0.

O bien

offset es mayor que la longitud de buffer.

O bien

size es menor que 0.

O bien

size es mayor que la longitud de buffer menos el valor del parámetro offset.

ObjectDisposedException

Se ha cerrado Socket.

SecurityException

Una llamada situada más arriba en la pila de llamadas no dispone de permiso para la operación solicitada.

El método BeginReceiveFrom comienza a leer de forma asincrónica los datagramas sin conexión procedentes de un host remoto. Llamar al método BeginReceiveFrom permite recibir datos en un subproceso de ejecución independiente.

Puede crear un método de devolución de llamada que implemente el delegado de AsyncCallback y pasar su nombre al método BeginReceiveFrom. Para ello, como mínimo, el parámetro state debe contener el objeto Socket conectado o predeterminado que se esté usando en la comunicación. Si la devolución de llamada necesita más información, puede crear una pequeña clase que contenga el objeto Socket y el resto de información requerida. Pase una instancia de esta clase al método BeginReceiveFrom a través del parámetro state.

El método de devolución de llamada utilizado ha de invocar al método EndReceiveFrom. Cuando la aplicación llame a BeginReceiveFrom, el sistema usará un subproceso independiente para ejecutar el método de devolución de llamada especificado y se quedará bloqueado en el método EndReceiveFrom hasta que Socket lea los datos o produzca una excepción. Para que el subproceso original se bloquee tras la llamada al método BeginReceiveFrom, use WaitHandle.WaitOne. Llame el método Set en T:System.Threading.ManualResetEvent en el método de devolución de llamada cuando desea que el subproceso original se siga ejecutando. Para obtener más información sobre cómo programar métodos de devolución de llamada, vea Ejemplo Callback.

NotaNota

Antes de llamar a BeginReceiveFrom, enlace explícitamente el objeto Socket a un extremo local mediante el método Bind; en caso contrario, BeginReceiveFrom producirá una excepción SocketException.

Este método lee datos en el parámetro buffer y captura el extremo de host remoto del que proceden los datos. Para obtener información sobre cómo recuperar este extremo, vea EndReceiveFrom. Este método resulta más útil cuando se desea recibir asincrónicamente datagramas sin conexión de un host desconocido o de múltiples hosts. En estos casos, BeginReceiveFrom leerá el primer datagrama de la cola que se reciba en el búfer de red local. Si el datagrama recibido es mayor que el tamaño del parámetro buffer, el método BeginReceiveFrom rellenará buffer con el máximo volumen posible del mensaje y producirá una excepción SocketException. Si utiliza un protocolo poco fiable, se perderán los datos superfluos. Si utiliza un protocolo de confianza, los datos superfluos quedarán retenidos por el proveedor de servicios y se podrán recuperar llamando al método BeginReceiveFrom con un búfer suficientemente grande.

Para garantizar que siempre se devuelva el extremo del host remoto, una aplicación debería enlazar explícitamente Socket a un extremo local utilizando el método Bind y, a continuación, llamar al método SetSocketOption con el parámetro optionLevel establecido según corresponda en IP o IPv6, el parámetro optionName establecido en PacketInformationy el parámetro optionValue para habilitar esta opción antes de llamar al método BeginReceiveFrom. De lo contrario, es posible que el extremo del host remoto no se devuelva cuando el remitente ha enviado varios datagramas antes de que el receptor haya llamado al método BeginReceiveFrom.

Si bien el método BeginReceiveFrom está pensado para protocolos sin conexión, también se puede usar un protocolo basado en conexiones. Si se opta por lo último, primero debe establecerse conexión con un host remoto llamando al método Connect / BeginConnect o aceptar una solicitud de conexión entrante llamando al método Accept o BeginAccept. Si se llama al método BeginReceiveFrom antes de establecer o aceptar una conexión, se producirá una excepción SocketException. Asimismo, antes de llamar al método BeginReceiveFrom, se puede establecer un host remoto predeterminado para un protocolo sin conexión. En cualquiera de estos casos, el método BeginReceiveFrom omitirá el parámetro remoteEP y sólo recibirá datos del host remoto conectado o predeterminado.

Con los sockets basados en conexiones, BeginReceiveFrom leerá tantos datos como haya disponibles hasta llegar al número de bytes especificado por el parámetro size.

Para cancelar un BeginReceiveFrom pendiente, llame al método Close.

NotaNota

Si se produce una excepción SocketException, utilice la propiedad SocketException.ErrorCode para obtener el correspondiente código de error. Una vez obtenido este código, consulte en MSDN Library la documentación de códigos de error de la API de Windows Sockets, versión 2, para ver una descripción detallada del error.

NotaNota

Este miembro envía la información de traza cuando se habilita la traza de red en la aplicación. Para obtener más información, vea Traza de la red.

NotaNota

El contexto de ejecución (el contexto de seguridad, el usuario suplantado y el contexto de llamada) se almacena en memoria caché para los métodos Socket asincrónicos. Después del primer uso de un contexto concreto (un método asincrónico Socket concreto, una instancia de Socket concreta y una devolución de llamada concreta), los usos posteriores de dicho contexto experimentarán una mejora de rendimiento.

NotaNota

El atributo HostProtectionAttribute aplicado a este tipo o miembro tiene el siguiente valor de propiedad Resources: ExternalThreading. El atributo HostProtectionAttribute no afecta a las aplicaciones de escritorio (que normalmente se inician haciendo doble clic en un icono, escribiendo un comando o introduciendo una dirección URL en el explorador). Para obtener más información, vea la clase HostProtectionAttribute o Programación en SQL Server y atributos de protección de host.

En el siguiente ejemplo de código se reciben de forma asincrónica datagramas sin conexión desde un host remoto.


	IPHostEntry lipa = Dns.Resolve("host.contoso.com");
	IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

       Socket s = new Socket(lep.Address.AddressFamily,
       	                           SocketType.Dgram,
                                         ProtocolType.Udp);

       IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
       EndPoint tempRemoteEP = (EndPoint)sender;
       s.Connect(sender);

       try{
            while(true){
                 allDone.Reset();
                 StateObject so2 = new StateObject();
                 so2.workSocket = s;
                 Console.WriteLine("Attempting to Receive data from host.contoso.com");

                 s.BeginReceiveFrom(so2.buffer, 0, StateObject.BUFFER_SIZE,0, ref tempRemoteEP,
	                                   new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so2);	
                 allDone.WaitOne();
            }
       }
       catch (Exception e){
            Console.WriteLine(e.ToString());
       }


.NET Framework

Compatible con: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.