Domanda

Io uso java ServerSocket di classe per l'applicazione server.Fa il metodo accept() partecipare in tcp/ip stretta di mano?

Per come la vedo io in tcp/ip dump e dal comando netstat, i clienti di stabilire connessioni con la prima di accettare la chiamata del metodo e restituire l'oggetto Socket.

È java problema, o non capisco accept() semantica?

È stato utile?

Soluzione

Generalmente in Unix, se si seleziona la presa con listen(), il sistema operativo inizia ad accettare le connessioni.Quando si chiama la accept() la funzione, il sistema operativo semplicemente le mani sopra già aperta la connessione.Ascoltare richiede un parametro che permette di specificare quanti 'non accettate le connessioni aperte il sistema operativo lo permette (cioèla dimensione della coda).

Altri suggerimenti

Il metodo accept non partecipa attivamente alla stretta di mano, di per sé. L'invio e la ricezione dei messaggi è implementato nel protocollo TCP / IP, in genere nello spazio kernel del sistema operativo.

Tuttavia, il metodo accept() è coinvolto, nel senso che lo stack TCP / IP sarà solo inviare il messaggio SYN-ACK se qualche processo ha una chiamata accept() attivo per un legame socket con il relativo indirizzo IP e la porta. Quando l'handshake a tre vie è stata completata, la chiamata al metodo accept() verrà completata.

Se nessun processo chiama accept() nel tempo il messaggio SYN in entrata verrà abbandonato dal kernel e il client remoto alla fine timeout il tentativo di connessione. (D'altra parte, se l'indirizzo IP / porta non è vincolata, allora il kernel è in grado di rispondere con un RST, e il client remoto vedrà una "connection refused".)

Accetta ritorna solo dopo che il client e il server sono collegati (stretta di mano, ecc).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top