


Bagaimanakah pelayan mengetahui bahawa klien tidak lagi wujud?
. Inilah sebabnya mengapa beberapa algoritma PING/PONG atau TCP keep-alive digunakan. Saya mencipta aplikasi pelayan-pelanggan yang mudah di mana pelanggan menyambung ke pelayan dan menghantar mesej ringkas selepas 10 saat. Apa yang mengelirukan saya ialah bagaimana pelayan mengetahui bahawa pelanggan tidak lagi wujud dalam dua kes berikut:
(Sekali lagi, saya tidak faham bagaimana ia tahu klien tidak lagi wujud)
- Saya mengandaikan sistem pengendalian (atau perpustakaan golang
- ) terlibat dan ia mengendalikan situasi ini dengan menghantar mesej tambahan atau serupa sebelum sambungan TCP sebenarnya ditutup.
- Sebarang bantuan dialu-alukan. Di bawah ialah kod penuh yang saya gunakan supaya anda boleh menjalankannya secara tempatan atau dalam Go Playground dalam talian.
Error Reading: read tcp 127.0.0.1:8080->127.0.0.1:60845 : wsarecv: 现有连接被远程主机强行关闭.
client.go
package main import ( "fmt" "net" "time" ) func main() { // Connect to the server conn, err := net.Dial("tcp", "localhost:8080") if err != nil { fmt.Println("Error connecting:", err) return } defer conn.Close() // Send a message to the server message := "Hello from client!" time.Sleep(10000 * time.Millisecond) conn.Write([]byte(message)) // Read the response from the server buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading:", err) return } // Print the server's response fmt.Printf("Received response from server: %s\n", buffer[:n]) }
server.gonet
package main import ( "fmt" "net" ) func handleConnection(conn net.Conn) { defer conn.Close() // Obtain and print the client's IP address when the connection is established clientAddr := conn.RemoteAddr() fmt.Printf("Client connected from IP address: %s\n", clientAddr) for { // Read data from the client buffer := make([]byte, 1024) n, err := conn.Read(buffer) if err != nil { fmt.Println("Error reading:", err) return } // Print received message fmt.Printf("Received message from client (%s): %s\n", clientAddr, buffer[:n]) // Send a response back to the client response := "Hello from server!" conn.Write([]byte(response)) } } func main() { // Start listening on a port listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("Error listening:", err) return } defer listener.Close() fmt.Println("Server listening on port 8080") for { // Wait for a connection conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } // Handle the connection in a goroutine go handleConnection(conn) } }
Saya sedar saya bercakap tentang sesuatu yang saya tidak begitu biasa, jadi saya mengujinya sendiri. Contoh mainan, dalam tiga terminal berasingan pada mesin yang sama:
Penyeliaan:Ia adalah ACK, selebihnya harus jelas. )
Pelayan:
Pelanggan:
sudo tcpdump -tttt -i lo port 8887
(您可能需要找出您的本地主机设备是什么,也许是 lo0
,使用 sudo tcpdump -D
。观察 Flags 字段:.
Pelanggan: SYNnc -l 8887
nc localhost 8887
Pelanggan: ACK
- Taip klien dan tekan Enter
- Pelanggan: PSH ACK
- Pelayan: ACK
Taip pelayan dan tekan Enter
- Pelayan: PSH ACK
- Pelanggan: ACK
a) Hentikan pelanggan, sama ada melalui ctrl-c atau sigkill:
- Pelanggan: FIN ACK
- Pelayan: FIN ACK
Pelanggan: ACK
- b) Hentikan pelayan:
- Pelayan: FIN ACK
- Pelanggan: ACK
Kemudian hentikan pelanggan:
- Pelanggan: FIN ACK
- Pelayan: RST
Percubaan ini telah diselesaikan pada WSL/Ubuntu. Saya belum menyusun atur cara anda lagi, tetapi anda boleh menguji sendiri senario anda. Satu perkara yang mengejutkan saya ialah walaupun saya menghentikan proses klien, FIN masih dihantar, menunjukkan bahawa jika proses klien ditamatkan dengan port terbuka, adalah tanggungjawab kernel untuk menghantar FIN. Selain itu, apabila proses bahagian pelayan dihentikan, FIN tidak dihantar, menyebabkan klien menghadapi respons RST.
-
Pelaksanaan kernel protokol
- TCP mengurus perkara ini selain daripada apa yang berlaku dalam ini sama sekali tidak berkaitan dengan Go.
Atas ialah kandungan terperinci Bagaimanakah pelayan mengetahui bahawa klien tidak lagi wujud?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Artikel ini membincangkan perintah Go FMT dalam pengaturcaraan GO, yang format kod untuk mematuhi garis panduan gaya rasmi. Ia menyoroti kepentingan GO FMT untuk mengekalkan konsistensi kod, kebolehbacaan, dan mengurangkan perdebatan gaya. Amalan terbaik untuk

Artikel ini memperkenalkan pelbagai kaedah dan alat untuk memantau pangkalan data PostgreSQL di bawah sistem Debian, membantu anda memahami pemantauan prestasi pangkalan data sepenuhnya. 1. Gunakan PostgreSQL untuk membina pemantauan PostgreSQL sendiri menyediakan pelbagai pandangan untuk pemantauan aktiviti pangkalan data: PG_STAT_ACTIVITY: Memaparkan aktiviti pangkalan data dalam masa nyata, termasuk sambungan, pertanyaan, urus niaga dan maklumat lain. PG_STAT_REPLITI: Memantau status replikasi, terutamanya sesuai untuk kluster replikasi aliran. PG_STAT_DATABASE: Menyediakan statistik pangkalan data, seperti saiz pangkalan data, masa komitmen/masa rollback transaksi dan petunjuk utama lain. 2. Gunakan alat analisis log pgbadg

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...
