net: meta bug for Go2 changes

mklgxw1f  于 5个月前  发布在  Go
关注(0)|答案(8)|浏览(65)

这是一个关于我们可能在未来改变的net/v2(~ "Go 2")包的元数据/索引错误,包括指向其他问题的链接,或者是关于API问题/清理工作的评论,这些评论太少,不足以成为它们自己的bug。
(这与net/httpnet/mailnet/rpcnet/smtpnet/nextprotonet/url无关。如果需要的话,那些应该有自己的bug。)

m3eecexj

m3eecexj1#

从UDP连接中读取数据可能有至少1种过多的方法:

go1.txt:pkg net, method (*UDPConn) Read([]uint8) (int, error)
go1.txt:pkg net, method (*UDPConn) ReadFrom([]uint8) (int, Addr, error)
go1.txt:pkg net, method (*UDPConn) ReadFromUDP([]uint8) (int, *UDPAddr, error)
go1.1.txt:pkg net, method (*UDPConn) ReadMsgUDP([]uint8, []uint8) (int, int, int, *UDPAddr, error)

同样,对于UnixConn和IPConn也是如此。
也许它们仍然不够充分,因为在以下链接中提到:
https://golang.org/pkg/net/#UDPConn.ReadMsgUDP
可以使用golang.org/x/net/ipv4和golang.org/x/net/ipv6包来操作oob中的IP层套接字选项。
也许我们可以将其放在一个地方,并删除一些冗余的选项。

0dxa2lsx

0dxa2lsx4#

这个现在已经标记为1.13版本,但自2012年以来一直开放。

htzpubme

htzpubme5#

以下是我脑海中的一些想法,尽管这些都必须是单独的提案,我仍然没有具体的草稿提案:

  1. 在用户附近的包和协议栈附近的包之间建立缓冲机制,例如net/http、crypto/tls和net包。背后的动机是:a)实现与传输层协议属性(如链路/路径MTU和封装开销)相适应的高效分层缓冲;b)提供一种无缝处理面向连接协议上的部分读写和无连接协议上的读写消息的方法,以帮助使用io.Reader接口的应用程序通过数据报/基于消息的协议进行通信。
  2. 为特定网络类型的打印机,例如net.IP和net.HardwareAddr。背后的动机是为需要在各种文本形式的管道系统上工作的人提供一种控制这些类型各种输出形式的方法。
zed5wv10

zed5wv106#

翻译结果:建议在监听器接口中添加 SetDeadline 方法。

f8rj6qna

f8rj6qna8#

在我的网络包贡献后的几点思考:

func LookupCNAME(string) ([]string, error) {/*...*/}

// Struct, insted of returning multiple values in LookupHostInfo, so that we can add more field in the future.
type HostInfo struct {
    Addrs         []netip.Addr
    CanonicalName string
}

func LookupHostInfo(string) (HostInfo, error) {/*...*/}

func LookupCanonicalName(h string) (string, error) {
    hi, err := LookupHostInfo(h)
    if err != nil {
        return "", err
    }
    return hi.CanonicalName, nil
}
  • 网络作为字符串传递,应该是一个特殊类型,例如:
type Network uint8

const (
    NetworkUDP Network = iota
    NetworkUDP4
    NetworkUDP6
    NetworkTCP
    NetworkTCP4
    NetworkTCP6

    // ....
)
  • 我们有一堆用于解析主机名到 IP 地址的方法(LookupHostLookupIPLookupIPAddrLookupNetIP),应该只有一个:
func LookupIP(network Network, host string) ([]netip.Addr, error) {
    hi, err := LookupHostInfo(h)
    if err != nil {
        return nil, err
    }
    return hi.Addrs, nil
}
  • 支持所有 DNS 名称,而不仅仅是首选名称语法(https://datatracker.ietf.org/doc/html/rfc1035#section-2.3.1)(带转义符)。
  • DNSError 中删除 ErrIsTimeoutIsTemporaryIsNotFound 字段,保留从 unwrapErr 检索它们的方法。使所有字段不可导出,名称和服务器对于构建漂亮的错误消息很有用,但不确定它们在实际代码中有多大用处(我们甚至可以让 DNSError 不可导出)。
type DNSError struct {
    name      string
    server    netip.Addr
    unwrapErr error
}

保持仅返回少数错误条件的 Unwrap 行为,这种逻辑已移动到 Unwrap 方法中:
go/src/net/net.go
第 686 行至第 690 行的 3959d54
| | // 此时,我们 Package 的唯一错误是上下文错误,以允许用户检查已取消/超时的请求。 |
| | iferrors.Is(err, context.DeadlineExceeded) | | errors.Is(err, context.Canceled) { |
| | unwrapErr=err | | } |
而不是 IsNotFound 字段,定义一个全局错误并通过 (*DNSError).Unwrap 方法返回它。然后将其用作 errors.Is(err, net.ErrHostNotFound)

ErrHostNotFound = errors.New("no such host")
  • 删除未使用的错误类型,例如:DNSConfigError
  • DefaultResolver 应该是一个带有全局getter和setter的不可导出的 atomic.Pointer

相关问题