The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
46fo

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

  •  
  •   46fo · Oct 29, 2013 · 3637 views
    This topic created in 4758 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
    qingting
    Oct 29, 2013❤️1
    1
    我一般设置缓冲区为8K。UDP数据是一个包一个包的,和TCP的数据流概念不一样。如果UDP的接收缓冲区的大小不够, 只能接收到前面的数据,后面的数据就丢掉了。至于为什么在GO里会崩溃,那就不清楚了
    46fo
    46fo
    OP
    Oct 29, 2013
    2
    @qingting 那也不能崩掉啊
    myrual
    myrual
    Oct 29, 2013
    3
    你还不如直接用python的twisted,处理UDP比Go简单多了。
    wwwjfy
    wwwjfy
    Oct 29, 2013❤️1
    4
    试了试,没有崩溃...
    崩溃没有traceback么
    试试最新版本
    46fo
    46fo
    OP
    Oct 30, 2013
    5
    @wwwjfy 我的是go version go1.1.1 windows/amd64
    bigeagle
    bigeagle
    Oct 30, 2013
    6
    崩掉总有信息吧,invalid memory access或者index out of range吧,就是你缓冲区设置的不够,至于问为什么会崩掉,你相同的代码拿C写也会段错误。
    要么增加缓冲区要么用recover异常处理
    wwwjfy
    wwwjfy
    Oct 30, 2013
    7
    @xdeng 找个unix的机器试下?
    46fo
    46fo
    OP
    Oct 30, 2013
    8
    @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
    46fo
    OP
    Oct 30, 2013
    9
    @myrual 。。。
    timonwong
    timonwong
    Oct 30, 2013❤️1
    10
    More data is availabe 就继续读啊
    46fo
    46fo
    OP
    Oct 30, 2013
    11
    @wwwjfy
    @bigeagle
    @timonwong 谁能解释下这个? http://xdeng.cn/?p=1699
    bigeagle
    bigeagle
    Oct 30, 2013❤️1
    13
    @xdeng := 是「声明+赋值」,同时通过类型推断简化语法,是一个语法糖。你把:=拆成 var 和 = 你再看那些代码就明白了。 结构体成员不需要声明,所以不能用:=用。
    46fo
    46fo
    OP
    Oct 30, 2013
    14
    @bigeagle 那为什么第二个例子 j 可以两次 :=
    mkeith
    mkeith
    Oct 31, 2013
    15
    @xdeng
    k, j := test()
    k没定义过,2个里面只要有一个没定义过就行了。
    46fo
    46fo
    OP
    Oct 31, 2013
    16
    @wwwjfy 非常感谢
    46fo
    46fo
    OP
    Oct 31, 2013
    17
    @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
    wwwjfy
    Oct 31, 2013❤️1
    18
    @xdeng
    http://golang.org/pkg/net/
    Multiple goroutines may invoke methods on a PacketConn simultaneously.
    46fo
    46fo
    OP
    Nov 1, 2013
    19
    @wwwjfy 什么意思? 意思是可以协程安全的?
    wwwjfy
    wwwjfy
    Nov 1, 2013❤️1
    20
    @xdeng 是吧,既然这么说了.. 没研究过,不过看到源码里有fd.writeLock()
    46fo
    46fo
    OP
    Nov 1, 2013
    21
    @wwwjfy 3Q
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1640 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:13 · PVG 21:13 · LAX 05:13 · JFK 08:13
    ♥ Do have faith in what you're doing.