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

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

UDP 是User Datagram Protocol的簡稱, 中文名是用戶數(shù)據(jù)報協(xié)議,是OSI(Open System Interconnection,開放式系統(tǒng)互聯(lián)) 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù),IETF RFC 768是UDP的正式規(guī)范。UDP在IP報文的協(xié)議號是17。在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當報文發(fā)送之后,是無法得知其是否安全完整到達的。

1.Golang UDP服務(wù)

package main

import (

“fmt”

“net”

)

func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) {

_, err := conn.WriteToUDP([]byte(“From server: Hello I got your mesage “), addr)

if err != nil {

fmt.Printf(“Couldn’t send response %v”, err)

}

}

func main() {

p := make([]byte, 2048)

addr := net.UDPAddr{

Port: 12345,

IP: net.ParseIP(“127.0.0.1”),

}

ser, err := net.ListenUDP(“udp”, &addr)

if err != nil {

fmt.Printf(“Some error %vn”, err)

return

}

for {

_, ? ? remoteaddr, err := ser.ReadFromUDP(p)

fmt.Printf(“Read a message from %v %s n”, remoteaddr, p)

if err != nil {

fmt.Printf(“Some error %v”, err)

continue

}

go sendResponse(ser, remoteaddr)

}

}

2.Golang UDP 客戶端

package main

import (

“bufio”

“fmt”

“net”

“os”

“time”

)

func main() {

addr, err := net.ResolveUDPAddr(“udp”, “:12345”)

if err != nil {

fmt.Println(“net.ResolveUDPAddr fail.”, err)

os.Exit(1)

}

socket, err := net.DialUDP(“udp”, nil, addr)

if err != nil {

fmt.Println(“net.DialUDP fail.”, err)

os.Exit(1)

}

t := time.Now()

socket.SetDeadline(t.Add(time.Duration(5 * time.Second)))

// socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second)))

// socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second)))

defer socket.Close()

r := bufio.NewReader(os.Stdin)

for {

switch line, ok := r.ReadString(‘n’); true {

case ok != nil:

fmt.Printf(“bye bye!n”)

return

default:

_, err := socket.Write([]byte(line))

if err != nil {

fmt.Println(“error send data,err:”, err)

return

}

data := make([]byte, 1024)

_, remoteAddr, err := socket.ReadFromUDP(data)

if err != nil {

fmt.Println(“error recv data,err:”, err)

return

}

fmt.Printf(“from %s:%sn”, remoteAddr.String(), string(data))

}

}

}

3.可以把代表拷貝的本地運行測試,Golang的設(shè)置方法有三個:SetDeadline,SetWriteDeadline,SetReadDeadline,設(shè)置了Deadline是指定時間戳為超時點,操作指定時間戳連接就會超時,再次發(fā)送包,接受包就會超時會提示i/o timeout

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

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

所以要保持心跳在線就需要不斷刷新Deadline的時間戳。本文僅供參考,如果有相應(yīng)場景,會使用到,^_^。


wxgzh:ludong86

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容