2010-03-16 32 views
6

Aprendí un ejemplo de uso de sockets. En este ejemplo, un cliente envía una solicitud a un servidor para abrir un socket y luego el servidor (escuchando un puerto específico) abre un socket y todo está bien, el socket se "abre" desde ambos lados (cliente y servidor).¿Puedo cerrar y volver a abrir un socket?

Pero todavía no está claro para mí qué tan flexible es esto. Por ejemplo, es posible que el cliente cierre un socket abierto (desde ambos extremos) y lo vuelva a abrir (bajo la condición de que el servidor mantenga el socket abierto).

¿Es posible que el servidor "sepa" que un socket está cerrado en el lado del cliente? ¿Es posible que el cliente sepa que un socket está cerrado en el lado del servidor?

añadido:

Una cosa más importante para mí. ¿Qué sucede si una aplicación (sin servidor principal o cliente) falla, termina anormalmente, muere? ¿Cerrará todos los enchufes abiertos en el lado de la aplicación?

añadió 2:

¿Qué pasa si una aplicación en un lado de la toma de corriente está apagada (mató, cerrado, terminado) y entonces se conecta de nuevo (en la misma dirección de IP y el mismo puerto) ¿Deberíamos crear un nuevo socket entre las dos aplicaciones o podemos usar el antiguo socket (creado antes del bloqueo)?

Respuesta

2

¿Es posible que el servidor de "sabe" que una toma de corriente se cerró en el lado cliente?

Cuando el servidor intenta enviar algunos datos a ese cliente se lanzará una excepción correspondiente.

Una cosa más importante para mí. ¿Qué ocurre si una aplicación (sin servidor servidor o cliente) se bloquea, anormalmente terminado, asesinado? ¿Cerrará todos los enchufes abiertos en el lado de la aplicación ?

Se crean excepciones para el manejo de estos casos anormales. Si se produce un apagón y un cliente (o servidor) se apaga, el otro lado recibirá una excepción tan pronto como intente interactuar con el lado desactivado.

UPD:

¿Qué pasa si una aplicación en un lado de la toma de corriente está apagada (matado, cerrado, terminado) y luego se conecta de nuevo (en la misma dirección de IP y el mismo puerto). ¿Deberíamos crear un nuevo socket entre las dos aplicaciones o podemos usar el viejo socket (creado antes del bloqueo)?

Crear un nuevo socket.

9

Un socket se puede utilizar para muchas cosas para las cuales las respuestas a estas preguntas cambiarían, pero asumiré que estás hablando de TCP.

Por ejemplo, es posible que el cliente cierre un socket abierto (desde ambos extremos) y lo vuelva a abrir (bajo la condición de que el servidor mantenga el socket abierto).

No, porque TCP realizará un adiós y no podrá volver a establecer la conexión desde allí. Tendría que volver a hacer un triple apretón de manos, y eso inicia una nueva conexión.

¿Es posible que el servidor "sepa" que un socket está cerrado en el lado del cliente? ¿Es posible que el cliente sepa que un socket está cerrado en el lado del servidor?

Yes. TCP puede enviar un paquete de despedida o puede agotar el tiempo de un lado y es totalmente posible detectar estos escenarios en ambos casos.

+0

No entiendo el procedimiento. Por ejemplo, el cliente cierra el socket y el servidor no lo hace. El cliente intenta abrir un nuevo socket (desde el mismo puerto y la misma dirección IP) pero el servidor dice: "Lo siento, es imposible ya que ese socket ya existe". Y luego el cliente dice: bueno, existe para ti, pero lo cerré y no puedo volver a abrirlo. – Roman

+0

El servidor debe procesar sockets en diferentes subprocesos. No debería ser un problema abrir tomas (es decir, aceptar) en el mismo puerto. – Roman

+0

ah, qué lío feo con apodos. – Roman

2

Q1-> ¿Es posible que el servidor "sepa" que un socket está cerrado en el lado del cliente? ¿Es posible que el cliente sepa que un socket está cerrado en el lado del servidor?

A1 -> El servidor se dará cuenta, si el cliente cierra el socket y viceversa. En realidad, FIN se enviará desde el final, que se inicia para cerrar la conexión.

Q2> ¿Qué pasa si una aplicación en un lado de la toma de corriente está apagada (mató, cerrado, terminado) y luego se conecta de nuevo (en la misma dirección IP y el mismo puerto). ¿Deberíamos crear un nuevo socket entre las dos aplicaciones o podemos usar el antiguo socket (creado antes del bloqueo)?

A2-> Si se crea socket, el n.º de fabricación se unen con el puerto de IP-addr &, por lo enchufe en el lado del servidor tiene IP_del_servidor & algún puerto y el zócalo en el lado cliente tiene client-ip & algún puerto. si se produce un bloqueo en el cliente, todos los fd se liberan y no pueden reutilizarse. Si usamos el mismo fd, el sistema lo tratará como el archivo normal fd.

Cuestiones relacionadas