V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xdeng
V2EX  ›  Go 编程语言

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

  •  
  •   xdeng · 2013-10-29 18:30:50 +08:00 · 2640 次点击
    这是一个创建于 4049 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var buf [8]byte
    for {
    n, err := conn.Read(buf[0:])
    checkError(err)
    fmt.Println(string(buf[0:n]))
    }
    当客户发送大于8byte数据时 Read 直接崩溃了。。。求解。。。为什么不像socket那样传长度
    第 1 条附言  ·  2013-10-30 10:15:40 +08:00
    不好意思天大的乌龙! 我搞错了。。。
    21 条回复    1970-01-01 08:00:00 +08:00
    qingting
        1
    qingting  
       2013-10-29 20:00:26 +08:00   ❤️ 1
    我一般设置缓冲区为8K。UDP数据是一个包一个包的,和TCP的数据流概念不一样。如果UDP的接收缓冲区的大小不够, 只能接收到前面的数据,后面的数据就丢掉了。至于为什么在GO里会崩溃,那就不清楚了
    xdeng
        2
    xdeng  
    OP
       2013-10-29 20:14:18 +08:00
    @qingting 那也不能崩掉啊
    myrual
        3
    myrual  
       2013-10-29 20:57:04 +08:00
    你还不如直接用python的twisted,处理UDP比Go简单多了。
    wwwjfy
        4
    wwwjfy  
       2013-10-29 23:59:47 +08:00   ❤️ 1
    试了试,没有崩溃...
    崩溃没有traceback么
    试试最新版本
    xdeng
        5
    xdeng  
    OP
       2013-10-30 00:06:35 +08:00
    @wwwjfy 我的是go version go1.1.1 windows/amd64
    bigeagle
        6
    bigeagle  
       2013-10-30 01:35:40 +08:00
    崩掉总有信息吧,invalid memory access或者index out of range吧,就是你缓冲区设置的不够,至于问为什么会崩掉,你相同的代码拿C写也会段错误。
    要么增加缓冲区要么用recover异常处理
    wwwjfy
        7
    wwwjfy  
       2013-10-30 08:31:20 +08:00
    @xdeng 找个unix的机器试下?
    xdeng
        8
    xdeng  
    OP
       2013-10-30 08:50:17 +08:00
    @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有个长度啊
    xdeng
        9
    xdeng  
    OP
       2013-10-30 08:50:54 +08:00
    @myrual 。。。
    timonwong
        10
    timonwong  
       2013-10-30 09:25:50 +08:00   ❤️ 1
    More data is availabe 就继续读啊
    xdeng
        11
    xdeng  
    OP
       2013-10-30 16:22:35 +08:00
    @wwwjfy
    @bigeagle
    @timonwong 谁能解释下这个? http://xdeng.cn/?p=1699
    wwwjfy
        12
    wwwjfy  
       2013-10-30 19:32:57 +08:00   ❤️ 1
    bigeagle
        13
    bigeagle  
       2013-10-30 23:03:29 +08:00   ❤️ 1
    @xdeng := 是「声明+赋值」,同时通过类型推断简化语法,是一个语法糖。你把:=拆成 var 和 = 你再看那些代码就明白了。 结构体成员不需要声明,所以不能用:=用。
    xdeng
        14
    xdeng  
    OP
       2013-10-30 23:20:55 +08:00
    @bigeagle 那为什么第二个例子 j 可以两次 :=
    mkeith
        15
    mkeith  
       2013-10-31 00:45:25 +08:00
    @xdeng
    k, j := test()
    k没定义过,2个里面只要有一个没定义过就行了。
    xdeng
        16
    xdeng  
    OP
       2013-10-31 00:47:03 +08:00
    @wwwjfy 非常感谢
    xdeng
        17
    xdeng  
    OP
       2013-10-31 17:25:37 +08:00
    @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  
       2013-10-31 22:53:38 +08:00   ❤️ 1
    @xdeng
    http://golang.org/pkg/net/
    Multiple goroutines may invoke methods on a PacketConn simultaneously.
    xdeng
        19
    xdeng  
    OP
       2013-11-01 00:26:28 +08:00
    @wwwjfy 什么意思? 意思是可以协程安全的?
    wwwjfy
        20
    wwwjfy  
       2013-11-01 10:19:05 +08:00   ❤️ 1
    @xdeng 是吧,既然这么说了.. 没研究过,不过看到源码里有fd.writeLock()
    xdeng
        21
    xdeng  
    OP
       2013-11-01 10:25:54 +08:00
    @wwwjfy 3Q
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3169 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:13 · PVG 08:13 · LAX 16:13 · JFK 19:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.