去监听已经使用的端口而不返回错误

时间:2014-06-30 06:18:44

标签: go

我已经有一个正在侦听端口80的web服务器(用node.js编写)。当我运行另一个也侦听端口80的Web服务器(用Go编写)时,Go webserver不会引发错误。

怎么会发生这种情况。

我的操作系统是Windows并且版本为go1.2.2。

3 个答案:

答案 0 :(得分:6)

我在工作中遇到这种情况。 golang服务器将监听IPv6端口80,而另一个应用程序只监听IPv4。

对我来说,Golang应用程序首先运行。它停止听v4,然后在其他应用关闭后恢复。

[稍后编辑] 为了说明这一点,我刚刚运行了在此MSDN页面上找到的WinSock绑定/侦听C ++代码,端口已更改为80,然后我使用了此Go代码:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("c:\\temp")))
    log.Fatal(http.ListenAndServe(":80", nil))
}

此设置有效,因为C ++正在收听127.0.0.1并且继续0.0.0.0将go代码更改为log.Fatal(http.ListenAndServe("127.0.0.1:80", nil))会导致建议使用nemo错误消息。

然后我启动了我的主要生产代码,它有一个Mongoose HTTP实例,它正在监听0.0.0.0:80,然后运行上面的Go代码(删除127.0.0.1),两者都在监听{{1} },这可以通过Process Explorer看到。

both apps listening to 0.0.0.0:80

答案 1 :(得分:0)

去报告错误就好了。您可能错过了检查返回的错误值。

test.go

package main

import (
    "net/http"
    "log"
)

func main() {
    log.Fatal(http.ListenAndServe(":8080", nil))
}

测试

$ nc -l 8080
$ go run test.go
2014/06/30 08:40:49 listen tcp :8080: bind: address already in use
exit status 1

答案 2 :(得分:-2)

您无法在同一端口上运行两个应用程序,还需要检查调用函数时返回的错误:

if err := http.ListenAndServe(":80", nil); err != nil {
    panic(err)
}