Различное поведение golang tcp socket на разных ОС - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу смоделировать http-сервер с сокетом tcp, написанным на Go.Программа хорошо работает на Linux или Mac, но имеет некоторые проблемы на Windows.Я настроил встроенный брандмауэр, чтобы разрешить подключения через порт.В Windows, когда браузер запрашивает программу, он показывает «Этот сайт недоступен. Соединение было сброшено».Вместо этого он может правильно ответить «Hello world» в Linux или Mac.

// implement http server with tcp socket
package main

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

var content = []byte(`HTTP/1.1 200 OK
Content-type: text/plain

Hello 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)
    }
}

Я пытаюсь изменить код для чтения всех байтов соединения в Windows, после чего программа отвечает правильно.

func handleConn(conn net.Conn) {
    var buf = make([]byte, 1024)
    _, err := conn.Read(buf)
    checkErr(err)
    conn.Write(content)
    defer conn.Close()
}

Но я нене знаю, почему я должен прочитать все байты соединения в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...