2011-03-25 14 views
7

Al crear un cliente TCP utilizando la API de socket, se utiliza un puerto en el host local para conectarse al servidor TCP.Es el puerto utilizado por un cliente TCP para conectarse a un servidor no disponible para otros servidores TCP

Parece que el puerto que se utiliza no está disponible para otra aplicación que es un servidor TCP para enlazar y actuar como servidor.

Como el puerto utilizado para el cliente se determina dinámicamente, puede ser un puerto que mi aplicación quiera usar como servidor.

¿Es cierto que el cliente TCP elegirá dinámicamente un puerto para usar y evitará que otros programas sean un servidor en ese puerto?

¿Puede un cliente controlar qué puerto utiliza para asegurarse de que no ocupe un puerto requerido por otro programa?

+0

Nos podría decir qué idioma que está utilizando. Entonces podemos proporcionar un código de muestra. –

+0

Hola, estoy usando C –

Respuesta

8

¿Es cierto que el cliente TCP elegirá dinámicamente un puerto para usar y evitará que otros programas sean un servidor en ese puerto?

Sí, lo es.

¿Puede un cliente controlar qué puerto utiliza para asegurarse de que no ocupe un puerto requerido por otro programa?

Sí, puede pero no debe. Use la propiedad Bind.

OK .. aquí está la cosa:

Cuando se establece una conexión con un servidor, se abre un puerto de socket que es mayor que 1024. El punto es, que va a ser un número alto de puerto.

Su servidor no debe abrir un puerto TCP mayor que 1024. Básicamente debe mantener su servidor ejecutándose en un puerto bajo. Eso es lo que nos dicen todos los documentos http.

También puede verificar si ya se tomó un puerto, y si es así, puede abrir el socket del servidor en otro puerto.

+1

-1: puede controlar el puerto, y no se requiere de ninguna manera que el rango actual sea> 5000. Windows XP/2003, por ejemplo, usaría de forma predeterminada el rango 1025-5000. – Erik

+0

Sí. Edité la respuesta cuando me di cuenta de que me había olvidado de eso. Pero no debes hacer eso, a menos que tengas razón sobre el problema que puedas causar. –

+0

Se ha eliminado el voto a favor ahora. – Erik

2

Sí, el puerto se seleccionará de un rango predefinido que varía desde el sistema operativo al sistema operativo y bloqueado para otros usos. Puede seleccionar un puerto específico con bind si lo necesita.

EDIT:

El único caso en el que se pueden tener múltiples sockets TCP unidos al mismo puerto local/IP es cuando se accept() nuevas tomas de un socket de escucha. Nunca puede bind() un socket TCP a un puerto/IP en uso. También existe cierta confusión en SO_REUSEADDR, esta opción de socket no permite reutilizar el puerto, simplemente relaja las reglas cuando solo hay conexiones de tiempo de espera muerto vinculadas al puerto que desea.

-1

Si un programa es escuchando enlazado a un puerto, no creo que otro pueda hacerlo. En general, los puertos inferiores están reservados para ciertos servicios, como HTTP en el puerto 80. Si desea un puerto aleatorio, debe generar uno por encima de 1024.Para obtener una lista de los puertos de uso común mira aquí: http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

edición: corregida a partir de comentarios a continuación

+0

No importa si un socket está escuchando o no, si está vinculado a un puerto no puedes vincular un nuevo socket no relacionado al mismo puerto. – Erik

Cuestiones relacionadas