Golang TCP服务器curl请求报错:Recv failure: Connection reset by peer
TCP服务器连接重置问题的原因与修复方案
你的代码问题在于:TCP服务器仅完成了接受连接的操作,打印连接对象后就直接退出进程。此时操作系统会强制重置已建立的TCP连接,导致curl请求收到curl: (56) Recv failure: Connection reset by peer错误——因为服务器端没有读取请求、返回响应,也没有正常关闭连接。
修复后的代码示例
要让服务器能正常处理HTTP请求,需要实现连接的持续监听、请求读取与响应返回:
package main import ( "fmt" "log" "net" ) func main() { listener, err := net.Listen("tcp", ":1729") if err != nil { log.Fatal(err) } defer listener.Close() // 退出时关闭监听器 fmt.Println("服务器启动,监听端口1729") // 循环接受新连接,支持多请求 for { conn, err := listener.Accept() if err != nil { log.Printf("接受连接失败: %v", err) continue } // 用goroutine并发处理连接,避免阻塞主循环 go handleClient(conn) } } func handleClient(conn net.Conn) { defer conn.Close() // 处理完成后关闭连接 fmt.Printf("新连接来自: %s\n", conn.RemoteAddr()) // 读取客户端发送的HTTP请求 buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { log.Printf("读取请求失败: %v", err) return } fmt.Printf("收到请求内容:\n%s\n", string(buf[:n])) // 返回标准HTTP响应 resp := "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\nHello, World!" _, err = conn.Write([]byte(resp)) if err != nil { log.Printf("发送响应失败: %v", err) } }
关键修复点
- 添加
for循环持续监听新连接,避免处理一次请求就退出 - 使用goroutine处理每个连接,保证服务器能同时响应多个请求
- 在
handleClient中读取请求数据,并返回符合HTTP协议格式的响应 - 通过
defer语句确保监听器和连接被正确关闭
内容的提问来源于stack exchange,提问作者Siddhant K.Singh
相关产品推荐
相关产品推荐

