gpt4 book ai didi

go - 为什么在指定本地端口时客户端会挂起?

转载 作者:IT王子 更新时间:2023-10-29 02:24:08 24 4
gpt4 key购买 nike

这与必须用 Java 提交的家庭作业有关。该程序按预期工作,将 server.go 的内容打印到终端。为什么客户端在两次或多次连续运行后会挂起 30 秒?

延迟仅在指定客户端端口(与分配相关)时发生。

// server.go
package main

import (
"log"
"net/http"
)

func main() {
log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("."))))
}

如果不是因为 defer conn.Close() 并且客户端仅在前一个客户端返回后才运行,我希望延迟是等待连接关闭的超时。

// client.go
package main

import (
"fmt"
"io"
"log"
"net"
"os"
)

func main() {
d := net.Dialer{
LocalAddr: &net.TCPAddr{
Port: 8081,
},
}

// Dial the server from client port 8081 to server port 8080
conn, err := d.Dial("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
defer conn.Close()

// Request the resource and log the response
fmt.Fprint(conn, "GET /server.go HTTP/1.0\r\n\r\n")
io.Copy(os.Stdout, conn)
}

延迟期间的 netstat 输出:

$ netstat -anp tcp | grep "8080\|8081"
tcp4 0 0 127.0.0.1.8081 127.0.0.1.8080 SYN_SENT
tcp46 0 0 *.8080 *.* LISTEN

最佳答案

我可以重现该错误。 AFAICS 它与 TCP 关闭序列有关,请参阅此 - http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm

在 OS X 上你可以像这样搞乱 tcp MSL

sudo sysctl net.inet.tcp.msl=100

所以一个修改过的客户端

// client.go
package main

import (
"fmt"
"io"
"log"
"net"
"os"
"time"
)

func check() {
d := net.Dialer{
LocalAddr: &net.TCPAddr{
Port: 8081,
},
}

// Dial the server from client port 8081 to server port 8080
conn, err := d.Dial("tcp", ":8080")
if err != nil {
log.Fatal(err)
}

// Request the resource and log the response
fmt.Fprint(conn, "GET /server.go HTTP/1.0\r\n\r\n")
io.Copy(os.Stdout, conn)
conn.Close()
}

// sudo sysctl net.inet.tcp.msl=100
func main() {

count := 0
for {
fmt.Printf("Try num %d\n", count)
count++
check()
time.Sleep(200 * time.Millisecond)
}
}

参见 https://en.wikipedia.org/wiki/Maximum_segment_lifetime

关于go - 为什么在指定本地端口时客户端会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28141776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com