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

2013-10-29 18:30:50 +08:00
 xdeng
var buf [8]byte
for {
n, err := conn.Read(buf[0:])
checkError(err)
fmt.Println(string(buf[0:n]))
}
当客户发送大于8byte数据时 Read 直接崩溃了。。。求解。。。为什么不像socket那样传长度
2621 次点击
所在节点    Go 编程语言
21 条回复
qingting
2013-10-29 20:00:26 +08:00
我一般设置缓冲区为8K。UDP数据是一个包一个包的,和TCP的数据流概念不一样。如果UDP的接收缓冲区的大小不够, 只能接收到前面的数据,后面的数据就丢掉了。至于为什么在GO里会崩溃,那就不清楚了
xdeng
2013-10-29 20:14:18 +08:00
@qingting 那也不能崩掉啊
myrual
2013-10-29 20:57:04 +08:00
你还不如直接用python的twisted,处理UDP比Go简单多了。
wwwjfy
2013-10-29 23:59:47 +08:00
试了试,没有崩溃...
崩溃没有traceback么
试试最新版本
xdeng
2013-10-30 00:06:35 +08:00
@wwwjfy 我的是go version go1.1.1 windows/amd64
bigeagle
2013-10-30 01:35:40 +08:00
崩掉总有信息吧,invalid memory access或者index out of range吧,就是你缓冲区设置的不够,至于问为什么会崩掉,你相同的代码拿C写也会段错误。
要么增加缓冲区要么用recover异常处理
wwwjfy
2013-10-30 08:31:20 +08:00
@xdeng 找个unix的机器试下?
xdeng
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
2013-10-30 08:50:54 +08:00
@myrual 。。。
timonwong
2013-10-30 09:25:50 +08:00
More data is availabe 就继续读啊
xdeng
2013-10-30 16:22:35 +08:00
@wwwjfy
@bigeagle
@timonwong 谁能解释下这个? http://xdeng.cn/?p=1699
wwwjfy
2013-10-30 19:32:57 +08:00
bigeagle
2013-10-30 23:03:29 +08:00
@xdeng := 是「声明+赋值」,同时通过类型推断简化语法,是一个语法糖。你把:=拆成 var 和 = 你再看那些代码就明白了。 结构体成员不需要声明,所以不能用:=用。
xdeng
2013-10-30 23:20:55 +08:00
@bigeagle 那为什么第二个例子 j 可以两次 :=
mkeith
2013-10-31 00:45:25 +08:00
@xdeng
k, j := test()
k没定义过,2个里面只要有一个没定义过就行了。
xdeng
2013-10-31 00:47:03 +08:00
@wwwjfy 非常感谢
xdeng
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
2013-10-31 22:53:38 +08:00
@xdeng
http://golang.org/pkg/net/
Multiple goroutines may invoke methods on a PacketConn simultaneously.
xdeng
2013-11-01 00:26:28 +08:00
@wwwjfy 什么意思? 意思是可以协程安全的?
wwwjfy
2013-11-01 10:19:05 +08:00
@xdeng 是吧,既然这么说了.. 没研究过,不过看到源码里有fd.writeLock()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/87324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX