2010-04-13 11 views
6

Si crea un socket de cliente TCP con el puerto 0 en lugar de un puerto distinto de cero, entonces el sistema operativo elige cualquier puerto efímero libre para usted. La mayoría de los sistemas operativos eligen puertos efímeros del IANA dynamic port range de 49152-65535. Sin embargo, en Windows Server 2003 y versiones anteriores (incluido XP), Microsoft usó los puertos 1025-5000 como el rango efímero, según su bind() documentation.¿Cómo puedo evitar que WinXP use los puertos 1025-5000 como efímero?

Ejecuto múltiples servicios de Java en el mismo hardware. En raras ocasiones, este rango colisiona con puertos conocidos que utilizo para otros servicios (por ejemplo, el puerto 4160 para el descubrimiento de Jini). Aunque es raro, esto ha causado problemas reales. ¿Hay alguna manera fácil de decirle a Windows o Java que utilicen un rango de puertos diferente para los sockets de los clientes? Los documentos de Microsoft indican que puedo cambiar el extremo superior de ese rango a través de la configuración de registro MaxUserPort TcpIP, pero no veo la forma de cambiar el extremo bajo.

Actualización: He hecho algunos progresos en esto. Parece que Microsoft tiene un concepto de puertos reservados que son excepciones al rango de puertos efímeros. Hay un registry setting que le permite cambiar esto de forma permanente y aparentemente debe haber una API para hacer lo mismo porque hay un data structure que contiene valores altos/bajos para rangos de puertos reservados, pero no puedo encontrar la función real llamada en cualquier lugar ... La solución de registro puede funcionar, pero ahora estoy obsesionado con esta API.

Update2: Acepté una solución en ServerFault para saber cómo hacerlo a través del registro de Windows. Todavía me gustaría una forma de hacerlo a través de API, pero supongo que estoy satisfecho por ahora.

+0

¿No debería ir a serverfault.com? –

+0

No, este es el lugar correcto, es claramente una cuestión de programación, no solo un caso de configuración de software aleatorio. – thecoshman

+0

@GrzegorzOledzki: buena pregunta. Tal vez debería enviar mensajes cruzados allí. Aceptaré las soluciones de sysadmin y las soluciones de programación. Para enchufes, codifiqué para asegurarme de que ninguno de mis puertos colisionara con puertos conocidos (Jini/River usa mucha asignación dinámica de puertos para Java RMI, ¡así que esto fue un desafío!), Pero el problema del socket del cliente me atrapó por sorpresa. –

Respuesta

0

No es tan elegante como usar compatibilidad con el sistema operativo para puertos efímeros, pero el docs muestra que debe poder especificar un puerto para que se vincule su socket. Especifique un puerto en la base del rango que desea y, si se utiliza, se lanzará una excepción, en cuyo caso incremente el puerto e intente de nuevo. Dado que Windows no usa el rango de puertos que desea, no debería haber muchas colisiones.

+0

Sí, gracias, eso es exactamente lo que implementé para enchufes. Pero me da miedo buscar en la gran base de código todos los sockets de salida y hacer lo mismo porque los desarrolladores hacen muchas más suposiciones sobre las conexiones salientes que se supone que son más simples ... –

Cuestiones relacionadas