socket 實現的 web 伺服器在 Windows 下的讀寫問題

WilliamA發表於2019-04-14

用 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 下則讀不讀都可以。不知道這是我的程式碼問題還是說由於系統的原因必須要這樣寫,又或者是其它原因?

更多原創文章乾貨分享,請關注公眾號
  • socket 實現的 web 伺服器在 Windows 下的讀寫問題
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章