1
qingting 2013-10-29 20:00:26 +08:00 1
我一般设置缓冲区为8K。UDP数据是一个包一个包的,和TCP的数据流概念不一样。如果UDP的接收缓冲区的大小不够, 只能接收到前面的数据,后面的数据就丢掉了。至于为什么在GO里会崩溃,那就不清楚了
|
3
myrual 2013-10-29 20:57:04 +08:00
你还不如直接用python的twisted,处理UDP比Go简单多了。
|
4
wwwjfy 2013-10-29 23:59:47 +08:00 1
试了试,没有崩溃...
崩溃没有traceback么 试试最新版本 |
6
bigeagle 2013-10-30 01:35:40 +08:00
崩掉总有信息吧,invalid memory access或者index out of range吧,就是你缓冲区设置的不够,至于问为什么会崩掉,你相同的代码拿C写也会段错误。
要么增加缓冲区要么用recover异常处理 |
8
xdeng OP @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有个长度啊 |
10
timonwong 2013-10-30 09:25:50 +08:00 1
More data is availabe 就继续读啊
|
11
xdeng OP |
12
wwwjfy 2013-10-30 19:32:57 +08:00 1
|
13
bigeagle 2013-10-30 23:03:29 +08:00 1
@xdeng := 是「声明+赋值」,同时通过类型推断简化语法,是一个语法糖。你把:=拆成 var 和 = 你再看那些代码就明白了。 结构体成员不需要声明,所以不能用:=用。
|
17
xdeng OP @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 |
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. |