You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:46:13