20210409很不错的golang udp示范并分析udp与net.Conn的关系 - ziyouzy/2021blog GitHub Wiki
https://studygolang.com/articles/9307
而在源代码net.udpsock.go中:
type UDPConn struct {
conn
}
同时在net.tcpsock.go中:
type TCPConn struct {
conn
}
由此可知,tcp与udp在这一层面拥有相同的实现逻辑
同时在net.go中不仅仅有Conn,还有conn,区别在于conn是个结构类:
type conn struct {
fd *netFD
}
并且其实是他实现了net.Conn接口
因此UDPConn与TCPConn也就都已经实现了net.Conn接口了,用法也可以完全的相同
再比如说,请看如下方法:
func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error) {
if !c.ok() {
return 0, nil, syscall.EINVAL
}
n, addr, err := c.readFrom(b)
if err != nil {
err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
}
return n, addr, err
}
其中用到的c.fd其实是内部字段conn对象类的内部字段,因此也可以这样说:
ReadFromUDP是一个为程序员提高效率的方法,如果你的程序不需要实现UDP,TCP等的混合逻辑,可以不借助net.Conn
UDP与TCP最大的不同在于:
tcp的net.ListenTCP("tcp4", tcpAddr)拿到的是一个listener,而listener需要再去accept不同IP地址的client,才能拿到一个net.Conn
udp的net.ListenUDP("udp", udpAddr)拿到的直接是一个net.Conn
差异还是很大的,逻辑上似乎还是要改改:
https://blog.csdn.net/guidao13/article/details/84037778