TCP がどのように機能するかを理解しようとしていますが、これまでにわかっているのは、「ランダムな」切断が発生した場合、一方の側が相手がまだ存在するかどうかを知る方法はありません。このため、一部の PING/PONG アルゴリズムまたは TCP キープアライブが使用されます。クライアントがサーバーに接続し、10 秒後に簡単なメッセージを送信する、単純なクライアント/サーバー アプリケーションを作成しました。私を混乱させるのは、次の 2 つの場合に、サーバーがクライアントが存在しなくなったことをどのように認識するかです。
(繰り返しになりますが、クライアントが存在しなくなったことをどのようにして認識するのか理解できません)
net ライブラリ) が関係しており、TCP 接続が実際に閉じられる前に追加のメッセージなどを送信することでこの状況に対処していると考えています。
client.go
リーリー
server.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]) }
監視:
sudo tcpdump -tttt -i lo port 8887 (ローカルホスト デバイスが何であるかを調べる必要があるかもしれません。おそらく
lo0 を使用してください。
sudo tcpdump -D. Flags フィールドを確認してください:
. は ACK、その他は一目瞭然です。)
nc -l 8887
nc ローカルホスト 8887
TCP プロトコルのカーネル実装がこれを処理します;
conn.Close() で何が起こるかは別として、これは Go とはまったく関係ありません。
以上がサーバーはクライアントが存在しなくなったことをどのようにして知るのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。