V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
46fo

go的udp读取问题小白求高手

  •  
  •   46fo · Oct 29, 2013 · 3189 views
    This topic created in 4572 days ago, the information mentioned may be changed or developed.
    var buf [8]byte
    for {
    n, err := conn.Read(buf[0:])
    checkError(err)
    fmt.Println(string(buf[0:n]))
    }
    当客户发送大于8byte数据时 Read 直接崩溃了。。。求解。。。为什么不像socket那样传长度
    Supplement 1  ·  Oct 30, 2013
    不好意思天大的乌龙! 我搞错了。。。
    21 replies    1970-01-01 08:00:00 +08:00
    qingting
        1
    qingting  
       Oct 29, 2013   ❤️ 1
    我一般设置缓冲区为8K。UDP数据是一个包一个包的,和TCP的数据流概念不一样。如果UDP的接收缓冲区的大小不够, 只能接收到前面的数据,后面的数据就丢掉了。至于为什么在GO里会崩溃,那就不清楚了
    46fo
        2
    46fo  
    OP
       Oct 29, 2013
    @qingting 那也不能崩掉啊
    myrual
        3
    myrual  
       Oct 29, 2013
    你还不如直接用python的twisted,处理UDP比Go简单多了。
    wwwjfy
        4
    wwwjfy  
       Oct 29, 2013   ❤️ 1
    试了试,没有崩溃...
    崩溃没有traceback么
    试试最新版本
    46fo
        5
    46fo  
    OP
       Oct 30, 2013
    @wwwjfy 我的是go version go1.1.1 windows/amd64
    bigeagle
        6
    bigeagle  
       Oct 30, 2013
    崩掉总有信息吧,invalid memory access或者index out of range吧,就是你缓冲区设置的不够,至于问为什么会崩掉,你相同的代码拿C写也会段错误。
    要么增加缓冲区要么用recover异常处理
    wwwjfy
        7
    wwwjfy  
       Oct 30, 2013
    @xdeng 找个unix的机器试下?
    46fo
        8
    46fo  
    OP
       Oct 30, 2013
    @bigeagle

    错误信息 (EXTRA string=WSARecv udp 0.0.0.0:1234: More data is available.)

    C代码不会段错误吧 int sendto ( socket s , const void * msg, int len, unsigned int flags, const
    struct sockaddr * to , int tolen ) ;
    C有个长度啊
    46fo
        9
    46fo  
    OP
       Oct 30, 2013
    @myrual 。。。
    timonwong
        10
    timonwong  
       Oct 30, 2013   ❤️ 1
    More data is availabe 就继续读啊
    46fo
        11
    46fo  
    OP
       Oct 30, 2013
    @wwwjfy
    @bigeagle
    @timonwong 谁能解释下这个? http://xdeng.cn/?p=1699
    bigeagle
        13
    bigeagle  
       Oct 30, 2013   ❤️ 1
    @xdeng := 是「声明+赋值」,同时通过类型推断简化语法,是一个语法糖。你把:=拆成 var 和 = 你再看那些代码就明白了。 结构体成员不需要声明,所以不能用:=用。
    46fo
        14
    46fo  
    OP
       Oct 30, 2013
    @bigeagle 那为什么第二个例子 j 可以两次 :=
    mkeith
        15
    mkeith  
       Oct 31, 2013
    @xdeng
    k, j := test()
    k没定义过,2个里面只要有一个没定义过就行了。
    46fo
        16
    46fo  
    OP
       Oct 31, 2013
    @wwwjfy 非常感谢
    46fo
        17
    46fo  
    OP
       Oct 31, 2013
    @wwwjfy
    func main() {

    ludpaddr, err := net.ResolveUDPAddr("udp", ":1234")
    checkError(err)

    conn, err := net.ListenUDP("udp", ludpaddr)
    defer conn.Close()
    checkError(err)

    for {
    var buf [64]byte
    len, addr, err := conn.ReadFromUDP(buf[:])
    checkError(err)

    go proData(len, addr, buf[:])
    }

    }
    能把 conn 传进proData吗? 里面要用到发送回给客户端。另外问 安全么 多个线程操作conn 我有搜过tcp的accept可以返回新的Conn
    wwwjfy
        18
    wwwjfy  
       Oct 31, 2013   ❤️ 1
    @xdeng
    http://golang.org/pkg/net/
    Multiple goroutines may invoke methods on a PacketConn simultaneously.
    46fo
        19
    46fo  
    OP
       Nov 1, 2013
    @wwwjfy 什么意思? 意思是可以协程安全的?
    wwwjfy
        20
    wwwjfy  
       Nov 1, 2013   ❤️ 1
    @xdeng 是吧,既然这么说了.. 没研究过,不过看到源码里有fd.writeLock()
    46fo
        21
    46fo  
    OP
       Nov 1, 2013
    @wwwjfy 3Q
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3637 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 05:01 · PVG 13:01 · LAX 22:01 · JFK 01:01
    ♥ Do have faith in what you're doing.