我想知道為什么從客戶(hù)端也在偵聽(tīng)的地址撥號(hào)不起作用(Version A)但偵聽(tīng)客戶(hù)端撥號(hào)到服務(wù)器的連接地址實(shí)際上有效(Version B)?!誰(shuí)可以給我解釋一下這個(gè)。Go對(duì)我來(lái)說(shuō)是新的,我仍然在學(xué)習(xí)很多東西。下面是一個(gè)例子:服務(wù)器程序:package mainimport . "fmt"import "net"import "os"func main() { Println("server") var listener, listenerError = net.Listen("tcp", "localhost:8080") if listenerError != nil { Println(listenerError) os.Exit(1) } for { con, _ := listener.Accept() // I don't care about the error in this example Printf("LocalAddr: %v\n", con.LocalAddr()) Printf("RemoteAddr: %v\n", con.RemoteAddr()) }}客戶(hù)端版本 A(不工作):package mainimport "net"import . "fmt"import "os"func main() { var listener, listenerError = net.Listen("tcp", "localhost:0") if listenerError != nil { Println(listenerError) os.Exit(1) } var dialer = new(net.Dialer) dialer.LocalAddr = listener.Addr() con, err := dialer.Dial("tcp", "localhost:8080") if err != nil { // dial tcp 127.0.0.1:60229->127.0.0.1:8080: bind: address already in use Println(err) os.Exit(2) } Printf("LocalAddr: %v\n", con.LocalAddr()) Printf("RemoteAddr: %v\n", con.RemoteAddr())}客戶(hù)端版本 B(工作):package mainimport "net"import . "fmt"import "os"func main() { Println("client") con, err := net.Dial("tcp", "localhost:8080") if err != nil { Println(err) os.Exit(2) } // magic happens here var listener, listenerError = net.Listen("tcp", con.LocalAddr().String()) if listenerError != nil { Println(listenerError) os.Exit(1) } Println("LISTENING") conn, _ := listener.Accept() // will accept on con.LocalAddr() Printf("LocalAddr: %v\n", conn.LocalAddr()) Printf("RemoteAddr: %v\n", conn.RemoteAddr())}
GO:為什么從客戶(hù)端偵聽(tīng)的地址撥號(hào)不起作用,而相反呢?
江戶(hù)川亂折騰
2021-12-06 19:48:46