2010-03-16 16 views
6

ho imparato un esempio di utilizzo di prese. In questo esempio, un client invia una richiesta a un server di aprire un socket e quindi il server (l'ascolto di una porta specifica) si apre un socket e tutto è andato bene, socket viene "aperto" da entrambi i lati (client e server).Posso chiudere e riaprire un socket?

ma non è ancora chiaro per me come flessibile è questa roba. Ad esempio, è possibile per il cliente per chiudere una presa aperto (da entrambe le estremità) e riaprirlo nuovamente (a condizione che il server mantiene la presa aperto).

E 'possibile per il server di "sapere" che una presa è stata chiusa sul lato client? È possibile che il client sappia che un socket è stato chiuso sul lato server?

aggiunto: più

Una cosa importante per me. Cosa succede se un'applicazione (nessun server o client) si blocca, terminato in modo anomalo, ucciso? Chiuderà tutte le prese aperte sul lato dell'applicazione?

aggiunte 2:

se un'applicazione su un lato della presa è spento (ucciso, chiuso, terminato) e quindi viene riacceso (sullo stesso indirizzo IP e la stessa porta). Dovremmo creare un nuovo socket tra le due applicazioni o siamo in grado di utilizzare la vecchia presa (creati prima del crash).

risposta

2

E 'possibile che il server "sapere" che una presa è stata chiusa sul lato cliente?

Quando il server tenta di inviare alcuni dati a tale client, verrà generata un'eccezione corrispondente.

Un'altra cosa importante per me. Cosa succede se un'applicazione (nessun client o server madre si arresta in modo anomalo, anomalo terminato, ucciso? Chiuderà tutte le prese aperte sul lato dell'applicazione ?

Vengono create eccezioni per la gestione di questi casi anomali. Se c'è un black out e un client (o un server) è disattivato, l'altra parte otterrà un'eccezione non appena cercherà di interagire con il lato disattivato.

UPD:

se un'applicazione su un lato del presa è spento (ucciso, chiuso, terminato) e poi viene riacceso (sullo stesso IP Indirizzo, la stessa porta). Dovremmo creare un nuovo socket tra le due applicazioni o possiamo usare il vecchio socket (creato prima del crash).

Creare una nuova presa.

9

Un socket può essere utilizzato per un sacco di cose per cui le risposte a queste domande potrebbero cambiare, ma presumo che tu stia parlando di TCP.

Ad esempio, è possibile per il client chiudere un socket aperto (da entrambi i lati) e riaprirlo nuovamente (a condizione che il server mantenga aperto il socket).

No, perché TCP eseguirà un addio e non sarà possibile riprendere la connessione da lì di nuovo. Dovresti fare di nuovo l'handshake a tre vie, e questo inizia una nuova connessione.

È possibile che il server "sappia" che un socket è stato chiuso sul lato client? È possibile che il client sappia che un socket è stato chiuso sul lato server?

Yes. TCP può inviare un pacchetto di addio o una parte può scadere ed è completamente possibile rilevare questi scenari in entrambi i casi.

+0

Non capisco la procedura. Ad esempio il client chiude il socket e il server non lo fa. Il client prova ad aprire un nuovo socket (dalla stessa porta e dall'indirizzo IP) ma il server dice: scusa è impossibile visto che esiste già un socket! E poi il cliente dice: bene esiste per te, ma l'ho chiuso e non posso riaprirlo di nuovo! – Roman

+0

Il server deve elaborare socket in thread diversi. Non dovrebbe essere un problema aprire i socket (cioè accettare) sulla stessa porta. – Roman

+0

ah, che brutto pasticcio con soprannomi. – Roman

2

Q1-> È possibile che il server "sappia" che un socket è stato chiuso sul lato client? È possibile che il client sappia che un socket è stato chiuso sul lato server?

A1 -> Il server saprà se il client chiude la presa e viceversa. In realtà FIN verrà inviato dalla fine, che sta iniziando a chiudere la connessione.

Q2-> Cosa succede se un'applicazione su un lato della presa è spenta (uccisa, chiusa, interrotta) e quindi viene riaccesa (sullo stesso indirizzo IP e sulla stessa porta). Dovremmo creare un nuovo socket tra le due applicazioni o possiamo usare il vecchio socket (creato prima del crash).

A2-> Se si crea socket, numero fd è legarsi con la porta ip-addr &, così presa sul lato server ha server ip & qualche porto e la presa sul lato client ha client-ip & qualche porto. se si verifica un arresto anomalo al client, tutti i file fd vengono liberati e non possono essere riutilizzati. Se usiamo lo stesso file system, il sistema lo tratterà come file normale fd.

Problemi correlati