zoukankan      html  css  js  c++  java
  • net包之UDPConn

    处理TCP和UDP之间的主要区别是如何处理多个客户端可能同时有数据包到达,没有一个管理TCP会话的缓冲。主要需要调用的是

    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)
            }
    }
    
  • 相关阅读:
    从头编写 asp.net core 2.0 web api 基础框架 (1)
    希腊字母表
    Python数据分析(二): Numpy技巧 (4/4)
    Python数据分析(二): Numpy技巧 (3/4)
    Python数据分析(二): Numpy技巧 (2/4)
    OLED液晶屏幕(3)串口读取文字并分割
    OLED液晶屏幕(2)取模软件
    OLED液晶屏幕(0)自动获取12ic地址液晶屏幕
    OLED液晶屏幕(1)OLED液晶屏幕ssd1306驱动芯片 arduino运行 ESP8266-07可以 12f不可以
    I2C 连接 12864 OLED 屏幕
  • 原文地址:https://www.cnblogs.com/zhepama/p/3028496.html
Copyright © 2011-2022 走看看