從零開始學golang之udp

freedbg發表於2018-02-27
package main

import (
    "fmt"
    "net"
)

/**
UDP是無連結! UDP是無連結! UDP是無連結!

DialUDP 是 pre-connected 其實是維持了一個傳送地址
ListenUDP 是 unconnect

如果*UDPConn是connected,讀寫方法是Read和Write。
如果*UDPConn是unconnected,讀寫方法是ReadFromUDP和WriteToUDP(以及ReadFrom和WriteTo)。

如果使用dail
你將失去SetKeepAlive或TCPConn和UDPConn的SetReadBuffer 這些函式, 除非做型別轉換
*/
func main() {
    var wait string
    Dc()
    fmt.Scanln(&wait)
}

func Dc() {
    var raddr *net.UDPAddr
    raddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:9123")
    conn, err := net.DialUDP("udp", nil, raddr)

    if err != nil {
        fmt.Println(err.Error())
    }

    _, err = conn.Write([]byte("ARE-U-THERE"))

    if err != nil {
        fmt.Println(err.Error())
    }

    var buf [1500]byte

    rlen, err := conn.Read(buf[0:])

    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Println(string(buf[0:rlen]))
}

func Ds() {
    var laddr *net.UDPAddr

    laddr, err := net.ResolveUDPAddr("udp", ":9123")

    conn, err := net.ListenUDP("udp", laddr)

    if err != nil {
        fmt.Println(err.Error())
    }

    go func(conn *net.UDPConn) {
        var rbuf [1500]byte

        for {
            rlen, raddr, err := conn.ReadFromUDP(rbuf[0:])

            if err != nil {
                fmt.Println(err.Error())
            }

            fmt.Println(string(rbuf[0:rlen]))

            conn.WriteToUDP([]byte("I-AM-HERE"), raddr)
        }
    }(conn)
}

所有程式碼地址

https://github.com/godla/TCP-IP-Study.git

相關文章