socket 实现的 web 服务器在 Windows 下的读写问题

用 socket 实现了个简陋的 web 服务器。这段代码在 Linux 和 Mac 下运行都是正常的,通过浏览器都可以能响应“Hello world!”;但是在 Windows 下运行时,通过浏览器访问会报错“This site can’t be reached The connection was reset.”。

// socket 实现的简单 web 服务器
package main

import (
    "log"
    "net"
    "os"
)

var content = []byte("HTTP/1.1 200 OK\r\nContent-type:text/plain\r\n\r\nHello world!")

func handleConn(conn net.Conn) {
    conn.Write(content)
    defer conn.Close()
}

func main() {
    addr := "localhost:10000"
    listener, err := net.Listen("tcp", addr)
    checkErr(err)
    defer listener.Close()

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal(err)
            continue
        }
        go handleConn(conn)
    }
}

func checkErr(err error) {
    if err != nil {
        log.Fatal(err)
        os.Exit(1)
    }
}

后来我把 handleConn 函数修改了一下:

func handleConn(conn net.Conn) {
    var buf = make([]byte, 1024) // buf 要确保所有数据都读出来了
    _, err := conn.Read(buf)
    checkErr(err)
    conn.Write(content)
    defer conn.Close()
}

改完之后,在 Linux, Mac 和 Windows 下都可以响应“Hello world!”了。也就是说在 Windows 系统下必须把连接里的字节全部读取之后才可以,而在 Linux 和 Mac 下则读不读都可以。不知道这是我的代码问题还是说由于系统的原因必须要这样写,又或者是其它原因?

已邀请:

要回复问题请先登录注册