TODO:Golang UDP鏈接簡單測試慎用Deadline

TODO:Golang UDP鏈接簡單測試慎用Deadline安全

UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。在網絡中它與TCP協議同樣用於處理數據包,是一種無鏈接的協議。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送以後,是沒法得知其是否安全完整到達的。網絡

1.Golang UDP服務socket

  1. package main
  2. import (
  3.     「fmt」
  4.     「net」
  5. )
  6. func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) {
  7.     _, err := conn.WriteToUDP([]byte(「From server: Hello I got your mesage 「), addr)
  8.     if err != nil {
  9.         fmt.Printf(「Couldn’t send response %v」, err)
  10.     }
  11. }
  12. func main() {
  13.     p := make([]byte, 2048)
  14.     addr := net.UDPAddr{
  15.         Port: 12345,
  16.         IP: net.ParseIP(「127.0.0.1」),
  17.     }
  18.     ser, err := net.ListenUDP(「udp」, &addr)
  19.     if err != nil {
  20.         fmt.Printf(「Some error %vn」, err)
  21.         return
  22.     }
  23.     for {
  24. _,     remoteaddr, err := ser.ReadFromUDP(p)
  25.         fmt.Printf(「Read a message from %v %s n」, remoteaddr, p)
  26.         if err != nil {
  27.             fmt.Printf(「Some error %v」, err)
  28.             continue
  29.         }
  30.         go sendResponse(ser, remoteaddr)
  31.     }
  32. }

2.Golang UDP 客戶端測試

  1. package main
  2. import (
  3.     「bufio」
  4.     「fmt」
  5.     「net」
  6.     「os」
  7.     「time」
  8. )
  9. func main() {
  10.     addr, err := net.ResolveUDPAddr(「udp」, 「:12345」)
  11.     if err != nil {
  12.         fmt.Println(「net.ResolveUDPAddr fail.」, err)
  13.         os.Exit(1)
  14.     }
  15.     socket, err := net.DialUDP(「udp」, nil, addr)
  16.     if err != nil {
  17.         fmt.Println(「net.DialUDP fail.」, err)
  18.         os.Exit(1)
  19.     }
  20.     t := time.Now()
  21.     socket.SetDeadline(t.Add(time.Duration(5 * time.Second)))
  22.     // socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second)))
  23.     // socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second)))
  24.     defer socket.Close()
  25.     r := bufio.NewReader(os.Stdin)
  26.     for {
  27.         switch line, ok := r.ReadString(‘n’); true {
  28.         case ok != nil:
  29.             fmt.Printf(「bye bye!n」)
  30.             return
  31.         default:
  32.             _, err := socket.Write([]byte(line))
  33.             if err != nil {
  34.                 fmt.Println(「error send data,err:」, err)
  35.                 return
  36.             }
  37.             data := make([]byte, 1024)
  38.             _, remoteAddr, err := socket.ReadFromUDP(data)
  39.             if err != nil {
  40.                 fmt.Println(「error recv data,err:」, err)
  41.                 return
  42.             }
  43.             fmt.Printf(「from %s:%sn」, remoteAddr.String(), string(data))
  44.         }
  45.     }
  46. }

3.能夠把表明拷貝的本地運行測試,Golang的設置方法有三個:SetDeadline,SetWriteDeadline,SetReadDeadline,設置了Deadline是指定時間戳爲超時點,操做指定時間戳鏈接就會超時,再次發送包,接受包就會超時會提示i/o timeoutcode

error send data,err: write udp 127.0.0.1:51608->127.0.0.1:12345: i/o timeoutserver

error recv data,err: read udp 127.0.0.1:51608->127.0.0.1:12345: i/o timeout排序

因此要保持心跳在線就須要不斷刷新Deadline的時間戳。本文僅供參考,若是有相應場景,會使用到,^_^。事務

wxgzh:ludong86rem

qrcode_for_gh_6bb1f39ae99c_258

相關文章
相關標籤/搜索