2

net.Listen()クライアントからのTCP接続をリッスンするために使用しています。

クライアントが接続を確立すると、Handler(conn net.Conn)それを処理します。

func Handler(conn net.Conn) {

  read_len, err := conn.Read(request)

  if err != nil {
    if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
      fmt.Println(neterr)
      PILOG("Client timeout!", PILOGWARNING)
      conn.Close()
      return
  }
}

DISCONNECTテストクライアントを使用して接続し、メッセージを送信せずにクライアントを突然終了しました。私のサーバーは、タイムアウトに達したときに接続を閉じる必要がありますが、長い待ち時間の後では決して起こりません。

私も試してみましconn.SetReadDeadline(time.Now())たが、まだうまくいかないようです。では、go のデフォルトの TCP タイムアウトとはどのようなもので、どのように設定すればよいのでしょうか?

netstat -nクライアントを殺した後、私も使用して以下の結果を得ました:

tcp4 0 0 127.0.0.1.12345 127.0.0.1.57296 CLOSE_WAIT

とはCLOSE_WAITどういう意味ですか?

4

1 に答える 1

6

SetReadDeadlineAFAIKで動作しますSetReadDeadline(time.Now())が、合理的な用途がなく、それが問題だと思います。たとえば、今からN 秒後にタイムアウトするには、次のようにします。

SetReadDeadline(time.Now().Add(N*time.Second))

ウィキペディアより

クローズウェイト

(サーバーとクライアントの両方) は、ローカル ユーザーからの接続終了要求を待っていることを表します。

于 2013-04-12T12:21:24.957 に答える