foreverzmy / http-s-listen-same-port

HTTP and HTTPS listen same port demo
4 stars 1 forks source link

怎么弄成多端口同时运行 #1

Open haodiao opened 2 months ago

haodiao commented 2 months ago

我是刚学 go ,但又想弄一个 http + https 同一端口的文件服务器,主要用于内网访问。 但这以下这种写法,运行得起来,刷一下 http 和 https 的访问,就无法切访问了, 报 panic: runtime error: index out of range [0] with length 0 错误,不知道怎么弄了,能帮忙看下吗,非常感谢!

func main() {
    ports := []string{":6788", ":6789"}
    for _, port := range ports {
        go func(port string) {
            ln, err := net.Listen("tcp", port)
            if err != nil {
                panic(err)
            }
            fasthttp.Serve(&Listener{ln}, requestHandler)
        }(port)
    }
}

func requestHandler(ctx *fasthttp.RequestCtx) {
    fs := &fasthttp.FS{
        Root:               "D:/www",
        IndexNames:         []string{"index.html"},
        GenerateIndexPages: true,
        Compress:           true,
        AcceptByteRange:    true,
    }
    fsHandler := fs.NewRequestHandler()
    fsHandler(ctx)
}
bddjr commented 2 months ago

我运行时候也发现了这个问题,运行一段时间莫名其妙有概率出现一个错误然后终止了,然后我放弃了。

可能应该在Accept里捕捉panic,防止一个连接错误就把服务器搞崩


大家可以看看我写的工具,不会出现上述错误,题主也用了

https://github.com/bddjr/hlfhr

bddjr commented 2 months ago

问题可能出在这里,但是可能不完全是。
io.EOF 了还不结束这个Accept程序,写这个程序的也是神人了。
这个错误正常情况下不会出现在TCP连接,一般是TCP连接出问题了(例如连接已关闭、连接已重置)之后,被bufio识别为未知错误,返回 io.EOF ,而这个神人写的程序居然跳过这个错误继续运行,这可能导致了后面的指针溢出,导致产生一个这样的panic,然后整个程序意外终止了。

    b, err := peekConn.Peek(3)
    if err != nil {
        peekConn.Close()
        if err != io.EOF {
            return nil, err
        }
    }
bddjr commented 2 months ago

另外这个程序这样写,Aceept后续的Conn操作直接全堆到Accept里,理论上这会导致下一个连接迟迟没被Accept,此外每次都会从系统读取证书再解析再返回。

可是用 fasthttp 的应该都是追求极致握手与处理速度的,这导致了严重的性能问题。