2012-02-07 7 views
5

Si hago algo como esto:Unsureness acerca de pasar extremo para Socket.ReceiveFrom()

byte[] buffer = new byte[1024]; 
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("12.34.56.78"), 1337); 
sock.ReceiveFrom(buffer, ref remote); 

¿El método ReceiveFrom única recibir paquetes desde el punto final que se pasa? La documentación de la siguientes:

Con protocolos sin conexión, ReceiveFrom leerán el primer datagrama enqueued recibidos en la memoria intermedia de red local.

¿Eso significa que el EndPoint pasado solo se usa para almacenar el EndPoint del host del que proviene el paquete y no afecta en absoluto el comportamiento del método ReceiveFrom? Si es así, ¿por qué necesita ser pasado como "ref" en lugar de "out"?

+0

Después de hacer varias pruebas me he dado cuenta de que el valor del punto final pasado no importa. Solo se usa para almacenamiento. Pero todavía no sé por qué tiene que pasar como referencia entonces. – haiyyu

+0

¿No es EndPoint una estructura? – Joshua

+0

Sí, tienes razón. Aunque eso no debería hacer una diferencia en mi caso. – haiyyu

Respuesta

1

Tenga en cuenta que el método ReceiveFrom es un contenedor administrado para la función WinSock recvfrom. Esta función toma un puntero a la estructura sockaddr que es opcional y asignado/desasignado en el lado del llamante.

Con esto en mente que tienen algunas teorías ¿Por qué el EndPoint pasa como ref y no out:

  1. Tal vez para la consistencia con WinSock funcionar el EndPoint es asignado por la persona que llama y por lo tanto pasa por ref.
  2. Tal vez EndPoint se consideró en algún momento como un parámetro opcional, pero esto nunca se implementó (comprobé, debe ser no nulo).
  3. Quizás para algunos protocolos haya instrucciones de procesamiento pasadas a través del parámetro EndPoint. Tal vez incluso protocolos futuros :-)
Cuestiones relacionadas