4 回答

TA貢獻1856條經驗 獲得超5個贊
傳遞network
給Control
函數的是tcp4
IPv4 連接或tcp6
IPv6 連接(如果您正在建立傳出 TCP 連接)。
? ? ? ? // Network and address parameters passed to Control method are not
? ? ? ? // necessarily the ones passed to Dial. For example, passing "tcp" to Dial
? ? ? ? // will cause the Control function to be called with "tcp4" or "tcp6".
(在非 TCP 連接的情況下,其他字符串也是可能的。)
已知網絡是“tcp”、“tcp4”(僅限 IPv4)、“tcp6”(僅限 IPv6)、“udp”、“udp4”(僅限 IPv4)、“udp6”(僅限 IPv6)、“ip” 、“ip4”(僅限 IPv4)、“ip6”(僅限 IPv6)、“unix”、“unixgram”和“unixpacket”。

TA貢獻1818條經驗 獲得超8個贊
哦。我自己解決了這個問題。
我們無法配置強制 ipv6 連接,因為它是硬編碼的
...
if cm.scheme() == "https" && t.DialTLS != nil {
? ? ? ? var err error
? ? ? ? pconn.conn, err = t.DialTLS("tcp", cm.addr())
? ? ? ? if err != nil {
? ? ? ? ? ? return nil, wrapErr(err)
? ? ? ? }
...
我為 transport.go 添加了一個 ipv6only 標志,一個 getTcpString() 并且它有效。

TA貢獻1828條經驗 獲得超6個贊
這適用于 go1.17.1:
var (
zeroDialer net.Dialer
httpClient = &http.Client{
Timeout: 10 * time.Second,
}
)
func init() {
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
return zeroDialer.DialContext(ctx, "tcp4", addr)
}
httpClient.Transport = transport
}

TA貢獻1812條經驗 獲得超5個贊
我認為即使服務器正在偵聽“tcp6”,使用“tcp”運行 net.Dial 的客戶端也應該可以正常工作——在雙棧設置中。
當我遇到這個問題時,罪魁禍首是 /etc/hosts。它有一個主機條目,映射到 ipv4 地址而不是 ipv6 地址。這導致連接被拒絕。
我的測試示例如下:
客戶端代碼:
package main
import "net"
import "fmt"
func main() {
conn, err := net.Dial("tcp", "hostname:9876")
if err != nil {
fmt.Println("Error in net.Dial", err)
return
}
conn.Close()
fmt.Println("Successful")
}
服務器代碼:
package main
import "net"
import "fmt"
func main() {
lis, err := net.Listen("tcp6", ":9876")
if err != nil {
fmt.Println("Error in listen", err)
return
}
for {
_, err := lis.Accept()
if err != nil {
fmt.Println("Error in Accept", err)
return
}
}
}
這段代碼應該可以在雙堆棧設置上與干凈的 /etc/hosts 文件一起正常工作。
謝謝。
- 4 回答
- 0 關注
- 853 瀏覽
添加回答
舉報