Go语言 拨号器控制功能的用途是什么?

m0rkklqb  于 2023-02-17  发布在  Go
关注(0)|答案(1)|浏览(167)

我目前正在学习围棋网络编程。
目前,我自己正在进行一个使用上下文截止时间的超时测试。

package socket

import (
    "context"
    "net"
    "syscall"
    "testing"
    "time"
)

func TestDialContext(t *testing.T) {
    deadline := time.Now().Add(time.Second * 5)
    ctx, cancelFunc := context.WithDeadline(context.Background(), deadline)
    defer cancelFunc()

    var dialer net.Dialer
    dialer.Control = func(_, _ string, _ syscall.RawConn) error {
        time.Sleep(4 * time.Second)
        return nil
    }
    conn, err := dialer.DialContext(ctx, "tcp", "10.0.0.0:http")
    if err == nil {
        conn.Close()
        t.Fatal("expected no connection")
    }
    if nErr, ok := err.(net.Error); ok && nErr.Timeout() {
        t.Logf("expected timeout error: %v", err)
    } else {
        t.Errorf("expected timeout error; actual: %v", err)
    }
    if ctx.Err() != context.DeadlineExceeded {
        t.Errorf("expected deadline exceeded; actual: %v", ctx.Err())
    }
}

从代码中可以看到,我尝试使用一个截止时间为5秒的上下文进行连接。
此外,通过在请求时使用拨号器的控制函数,控制函数在连接后立即被调用(实际上就在连接前),以便在4秒后返回零错误。
按照我的意图,这个测试应该失败。原因是控制函数在5秒的截止时间到达之前返回了一个零错误。
但测试成功如下。

=== RUN   TestDialContext
    dial_context_test.go:27: expected timeout error: dial tcp 10.0.0.0:80: i/o timeout
--- PASS: TestDialContext (5.01s)
PASS

控制函数的目的到底是什么?控制函数返回的错误与net.Dial()函数返回的错误无关吗?像我写的代码那样使用控制函数进行测试是没有意义的吗?
感谢您阅读这个长问题!

eufgjt7s

eufgjt7s1#

控制功能的确切目的是什么?
在创建套接字之后和建立连接之前,给予拨号代码一个机会调用套接字底层文件描述符上的函数-例如syscall.Setsockopt函数之一。
控制函数返回的错误是否与net.Dial()函数返回的错误无关?
如果控制函数返回一个错误,则拨号失败并返回该错误。如果控制函数返回一个空错误,则拨号照常继续。
像我写的代码那样使用控制函数的测试是不是没有意义?
差不多吧。你的控制功能休眠4秒,但除此之外什么也不做。

相关问题