NetパッケージのUDPConn

2546 ワード

TCPとUDPの間の主な違いは、複数のクライアントが同時にパケットが到着し、TCPセッションを管理するバッファが1つもないことをどのように処理するかである.主に呼び出す必要があるのは
func ResolveUDPAddr(net, addr string) (*UDPAddr, os.Error)

func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error)

func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error)

func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error

func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error)


UDPConn
このタイプはConnインタフェースだけでなくPacketConnインタフェースも実現し,このインタフェースの主な方法であるReadFromとWriteToはパケットの読み取りと書き込みを処理するために用いられる.
type UDPConn struct {

        conn

}


クライアント:
package main



import (

        "net"

        "os"

        "fmt"

)



func main() {

        if len(os.Args) != 2 {

                fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])

                os.Exit(1)

        }

        service := os.Args[1]



        udpAddr, err := net.ResolveUDPAddr("up4", service)

        checkError(err)



        conn, err := net.DialUDP("udp", nil, udpAddr)

        checkError(err)



        _, err = conn.Write([]byte("anything"))

        checkError(err)



        var buf [512]byte

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

        checkError(err)



        fmt.Println(string(buf[0:n]))



        os.Exit(0)

}



func checkError(err error) {

        if err != nil {

                fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())

                os.Exit(1)

        }

}


サービス:
/* UDPDaytimeServer

 */

package main



import (

        "fmt"

        "net"

        "os"

        "time"

)



func main() {



        service := ":1200"

        udpAddr, err := net.ResolveUDPAddr("up4", service)

        checkError(err)



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

        checkError(err)



        for {

                handleClient(conn)

        }

}



func handleClient(conn *net.UDPConn) {



        var buf [512]byte



        _, addr, err := conn.ReadFromUDP(buf[0:])

        if err != nil {

                return

        }



        daytime := time.Now().String()



        conn.WriteToUDP([]byte(daytime), addr)

}



func checkError(err error) {

        if err != nil {

                fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())

                os.Exit(1)

        }

}