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)
            }
    }
    
  • 相关阅读:
    解决virtualbox与mac文件拖拽问题
    SNMP收集
    scapy的安装
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    subprocess.call(cmd, shell=True)
    能够把意见说的让人接受是个技能
    (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程
    ansible 与 Jinja2的结合 -- 安装zabbix
    运维自动化平台-背后的设计计划和架构
    命令行获取zabbix最新的issues
  • 原文地址:https://www.cnblogs.com/zhepama/p/3028496.html
Copyright © 2011-2022 走看看