Il server ha creato un socket e si è associato a una porta e ha avviato una discussione che è in loop per accettare la connessione. Qualche tempo dopo il ciclo si è interrotto a causa di un'eccezione che ha provocato l'uscita del thread, ma il socket è ancora limitato alla porta. Ora se il client fa una 'connessione' a questo server, ha successo. Come è possibile? Se capisco correttamente, 'connect' ritorna solo dopo che il server ha 'accept' sul socket di ascolto. Mi sto perdendo qualcosa qui?È possibile connettere la chiamata al ritorno del socket senza chiamare il server 'accept'?
risposta
Se ho capito bene, 'connect' restituisce solo dopo server non 'accetta' sul socket di ascolto. Mi sto perdendo qualcosa qui?
Sì. TCP stabilisce la connessione - l'handshake a 3 vie - sotto le copertine e la mette in una coda di connessione completata quando è pronta. Accept() restituisce la prossima connessione in attesa dal fronte di questa coda.
Dal punto di vista del cliente è "connesso" ma non parlerà con nessuno finché il server non accetta e non inizia l'elaborazione. Un po 'come quando si chiama un'azienda e vengono immediatamente messi nella coda di attesa. Sei "connesso" ma non ci sarà da fare fino a quando qualcuno non riprende e inizia a parlare.
Il tuo thread individuale potrebbe essere morto ma il processo è ancora attivo e il descrittore di file è ancora aperto, quindi TCP non sa cosa sta succedendo a livello di applicazione.
Le prese collegate entrano in una coda in attesa che il processo di ricezione le accetti(). C'è un backlog limitato di questi, una volta raggiunto il sistema operativo inizierà a rifiutare le connessioni oa ignorarle.
La mia domanda è quando ritorna la chiamata "connect"? Dopo che il server chiama "accetta" sul socket di connessione o quando va in ascolto con successo? Se il server non chiama "accept", possiamo aspettarci che "connect" nel client abbia successo? – kumar
Non sei corretto, la connessione NON attenderà che il server chiami accept(). Aspetta solo una risposta dal sistema operativo, che generalmente accoda la richiesta. – MarkR
- 1. Come posso connettere due dispositivi Android via socket senza server
- 2. È possibile connettere due dispositivi ios usando i socket ottenendo il loro indirizzo IP?
- 3. Come connettere Sqlcmd al server?
- 4. È possibile connettere LocalDB SQL Server Express in remoto?
- 5. Come connettere un server socket tramite proxy HTTP
- 6. È possibile il socket raw sull'interfaccia loopback?
- 7. È possibile richiamare subprocess.call senza attendere il completamento del processo?
- 8. Socket di dominio Unix: accept() non impostazione sun_path
- 9. Come connettere due server node.js con websocket?
- 10. C socket socket client/server
- 11. Come connettere l'estensione web di Chrome con il server localhost?
- 12. Perché la chiamata lambda Ruby 1.9 non è possibile senza il punto davanti alle parentesi?
- 13. Proxy trasparente: come passare il socket al server locale senza modifiche?
- 14. ServerSocket accetta socket di ritorno su una porta arbitraria?
- 15. È possibile utilizzare il server tableau senza desktop tableau?
- 16. È possibile eseguire un server socket e un client socket sulla stessa macchina?
- 17. Java: ternario senza restituzione. (Per la chiamata al metodo)
- 18. Connettere un server Web alla porta 80 senza essere root
- 19. GWT/StockWatcher: impossibile connettere il server
- 20. In C++, è possibile ottenere il tipo di ritorno di una funzione per dichiarare una variabile senza chiamare quella funzione?
- 21. È possibile creare loop eventi locali senza chiamare QApplication :: exec()?
- 22. È possibile avere un server JMS senza un server applicazioni?
- 23. È possibile recuperare una proprietà D-Bus senza chiamare org.freedesktop.DBus.Properties.Get?
- 24. È possibile chiamare il codice Java C++?
- 25. È possibile accedere al datastore GAE senza una richiesta http?
- 26. 0 o 1 valori di ritorno validi per la chiamata di funzione socket()
- 27. È possibile utilizzare OAuth 2.0 senza un server di reindirizzamento?
- 28. Ottenere la data/ora del pacchetto tramite la chiamata ioctl sul descrittore del file socket
- 29. Perché Java ServerSocket accept() restituisce un socket con la stessa porta di ServerSocket?
- 30. TLS con socket server php
La differenza tra la coda di attesa del servizio telefonico e una connessione TCP che non è stata ancora accettata() ed: qualsiasi byte inviato alla connessione TCP viene bufferizzato dal sistema operativo e ricevuto una volta che la chiamata ad accept() ha stato fatto. Sulla linea di attesa del sistema telefonico, qualsiasi cosa venga detta dal chiamante viene scartata. –
Stavo discutendo se aggiungere questo, grazie. Ovviamente non c'è nulla da dire che il servizio telefonico * non * ti stia registrando mentre pensi di essere in attesa e sta trasmettendo musica. :) – Duck
Vale anche la pena sottolineare che questo è ciò che il parametro 'backlog' per la chiamata' listen() 'è tutto - il backlog è il numero di connessioni che possono essere in quello stato connnected-but-not-accepted a ogni volta. – caf