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)
            }
    }
    
  • 相关阅读:
    从零开始整SpringBoot-工具与插件
    算法与数据结构学习笔记(目录)
    牛客小白月赛30(个人题解)
    Manjaro 上手使用简明教程
    C++函数:std::tie 详解
    Educational Codeforces Round 99 (Rated for Div. 2) (A ~ F)个人题解
    VS Code C++ 项目快速配置模板
    【字符串算法】字典树详解
    关于算法竞赛某些常见基础错误
    Teacher Ma专场
  • 原文地址:https://www.cnblogs.com/zhepama/p/3028496.html
Copyright © 2011-2022 走看看