2010-03-16 18 views
8

estoy escribiendo una biblioteca de servidor FTP (porque lo necesito y no puedo encontrar ningún buenas soluciones para este) en C# y tengo dos preguntas:Encuentra un puerto libre

  • ¿Cómo funciona IPEndPoint encontrar un puerto libre cuando lo hago new IPEndPoint(IPAddress.Any, 0), por ejemplo?

  • ¿Es posible encontrar un puerto libre de un rango (por ejemplo, de 1023 a 65535), sin el método GetActiveTcpConnections? Debido a que es lento, necesito una forma más rápida de hacerlo.

+1

posible duplicado de [Buscar el siguiente puerto TCP en .Net] (http://stackoverflow.com/questions/138043/find-the-next-tcp-port-in-net) –

Respuesta

13

Tan pronto como empiece a escuchar en un puerto no asignado (0), que será asignado por el sistema operativo (o, más precisamente, por la pila TCP/IP). Como la pila administra todos los puertos, puede asignar uno libre.

Así que simplemente comience a escuchar en su conexión y luego verifique el puerto en la propiedad LocalEndpoint para pasarlo al cliente. El TcpListener documentation contiene más información sobre esto.

Si necesita encontrar uno gratis en un rango, solo tiene que recorrer todo el rango e intentar comenzar a escuchar en cada uno. Si tiene éxito, encontró un puerto libre y puede salir de su ciclo; si no, simplemente continúa con el ciclo. Esta es la única manera confiable de hacerlo porque de lo contrario puede encontrarse en una condición de carrera con otros procesos o incluso con sus propios hilos que evalúan el mismo puerto libre y el primero que lo usa "gana", mientras que el otro código no será capaz de usar el puerto.