UDP是无连接协议,为什么Golang里面还有net.DialUDP方法?

socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
    IP:   net.IPv4(192, 168, 1, 103),
    Port: 8080,
})

换句话说,给UDP服务端发信息不是应该直接调用一个send方法,在send方法里面提供目标服务端的IP和端口就好了嘛,就像C#里面socket对象的SendTo方法一样,为什么Golang的API设计的这么奇怪。

另外就是以golang为例,UDP如果是无连接的,那么服务端该如何向内网的客户端主动推消息呢?是不是客户端得先主动连上,然后服务端就开始阻塞,等到有消息需要推给客户端之后之后再调用socket.WriteToUDP吗?

阅读 12k
3 个回答

首先你得明白UDP中connect函数和bind函数作用.
在golang中的UDPConn分为connected和unconnected.
如果*UDPConn是connected,读写方法是Read和Write。
如果*UDPConn是unconnected,读写方法是ReadFromUDP和WriteToUDP(以及ReadFrom和WriteTo)。
DialUDP中的UDPConn为connected是不能调用WriteToUDP发送给某个地址.
ListenUDP中的UDPCon为unconnected,直接可以调用WriteToUDP发送给某个地址.
Go的这种设计和Unix/Linux设计一致,这里可以参考Linux中的UDP文档.
http://man7.org/linux/man-pag...

多数时候消息并不是发完就完了啊,还要在本地分配的端口上收消息。DialUDP主要就是为了绑定一个scoket,为后续在同一个端口上收发消息保存一个上下文。有无连接是说传输层能否保证消息的可靠性,但端口收到的消息应该往哪个进程上传递总还是得知道的。tcp靠三次握手,udp就只有先发个包了

udp是无连接的,但是得指定接受方,dial只是为了抽象,并不是建立了连接

推荐问题