日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang tcp keepalive实践

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang tcp keepalive实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前文中已經介紹了TCP keep alive的做了詳盡說明,本文結合golang,介紹如何使用TCP keep alive。

目前golang net包不提供TCP keep alive?空閑多長時間開始探測、?探測總次數直接設置。

可以使用第三方包。

1.下載第三方包

git clone git@github.com:felixge/tcpkeepalive.git

注意放到GOPATH目錄下。

2.例子

2.1 server

server端,接受client連接請求,建立連接后,設置連接的空閑多長時間開始探測、探測時間間隔、探測總次數。

本例中,我們設置的參數如下:

  • 空閑多長時間開始探測?keepAliveIdle: 10s
  • 探測時間間隔?keepAliveInterval: 10s
  • 探測總次數?keepAliveCount:9

server端發送一次數據后,停住。等待10s,開始發送tcp keep alive.

server 代碼如下:

package mainimport ("net""log""time""github.com/tcpkeepalive" )func main() {addr := "0.0.0.0:8080"tcpAddr, err := net.ResolveTCPAddr("tcp",addr)if err != nil {log.Fatalf("net.ResovleTCPAddr fail:%s", addr)}listener, err := net.ListenTCP("tcp", tcpAddr)if err != nil {log.Fatalf("listen %s fail: %s", addr, err)} else {log.Println("rpc listening", addr)}for {conn, err := listener.Accept()if err != nil {log.Println("listener.Accept error:", err)continue}go handleConnection(conn)}}func setTcpKeepAlive(conn net.Conn) (*tcpkeepalive.Conn, error) {newConn, err := tcpkeepalive.EnableKeepAlive(conn)if err != nil {log.Println("EnableKeepAlive failed:", err)return nil, err}err = newConn.SetKeepAliveIdle(10*time.Second)if err != nil {log.Println("SetKeepAliveIdle failed:", err)return nil, err}err = newConn.SetKeepAliveCount(9)if err != nil {log.Println("SetKeepAliveCount failed:", err)return nil, err}err = newConn.SetKeepAliveInterval(10*time.Second)if err != nil {log.Println("SetKeepAliveInterval failed:", err)return nil, err}return newConn, nil }func handleConnection(conn net.Conn) {defer conn.Close()newConn, err := setTcpKeepAlive(conn)if err != nil {log.Println("setTcpKeepAlive failed:", err)return}var buffer []byte = []byte("You are welcome. I'm server.")for {time.Sleep(1*time.Second)n, err := newConn.Write(buffer)if err != nil {log.Println("Write error:", err)break}log.Println("send:", n)select{}}log.Println("connetion end")}

2.2 client

client端很簡單,負責接收數據。

package mainimport ("fmt""net""os" )func main() {conn, err := net.Dial("tcp", "127.0.0.1:8080")if err != nil {fmt.Println("dial failed:", err)os.Exit(1)}defer conn.Close()buffer := make([]byte, 512)for {n, err := conn.Read(buffer)if err != nil {fmt.Println("Read failed:", err)return}fmt.Println("count:", n, "msg:", string(buffer))}}

3.查看結果

server輸出

019/05/26 22:22:00 rpc listening 0.0.0.0:8080 2019/05/26 22:22:15 send: 28

client輸出

count: 28 msg: You are welcome. I'm server.

通過tcpdump 或者wireshark抓包,可以看到TCP Keep-Alive的數據包發送情況。

4.參考

Using TCP keepalive with Go

github tcpkeepalive

Just try, don't shy.

總結

以上是生活随笔為你收集整理的golang tcp keepalive实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。