Macos go:http服务器在osx上不工作

Macos go:http服务器在osx上不工作,macos,sockets,networking,go,httpserver,Macos,Sockets,Networking,Go,Httpserver,这对我不起作用。源代码: package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndSer

这对我不起作用。源代码:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe("127.0.0.1:8080", nil)
}
当我尝试连接时,我得到的是:

$ curl 127.0.0.1:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Operation timed out
$ nc -v -G 5 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Operation timed out
nc尝试连接tcpdump时,仅显示SYN数据包:

$ tcpdump -i lo0 port 8080
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
18:21:30.906638 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569352 ecr 0,sackOK,eol], length 0
18:21:31.006824 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569452 ecr 0,sackOK,eol], length 0
18:21:31.106989 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569552 ecr 0,sackOK,eol], length 0
18:21:31.208141 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569653 ecr 0,sackOK,eol], length 0
18:21:31.308288 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569753 ecr 0,sackOK,eol], length 0
18:21:31.408336 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118569853 ecr 0,sackOK,eol], length 0
18:21:31.609143 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118570053 ecr 0,sackOK,eol], length 0
18:21:32.011215 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118570453 ecr 0,sackOK,eol], length 0
18:21:32.812512 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118571253 ecr 0,sackOK,eol], length 0
18:21:34.414686 IP localhost.52799 > localhost.http-alt: Flags [S], seq 3375761924, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 118572853 ecr 0,sackOK,eol], length 0
下面是服务器端dtruss输出的最后一部分(从套接字调用开始):

当我运行nc时,将不再显示任何内容,因此它甚至不会注意到连接尝试

我没有启用防火墙,其他一切正常,只有Go程序有这个问题(特别是我不能使用docker机器)

我怎么修理它

编辑: 我认为#Err35是:

#define EDEADLK     35  /* Resource deadlock would occur */
……什么

编辑2:

  • go:go1.6版达尔文/amd64
  • OSX:10.11.4
服务器未退出,它将无限期地侦听

编辑3:

我试过“去建造”和“去运行”,没有区别

使用localhost而不是127.0.0.1-没有区别

使用
w.Write([]字节(fmt.Sprintf(“你好,我爱%s!”,r.URL.Path[1:])
代替-没有区别。顺便说一句-它说
nc:connectx到127.0.0.1端口8080(tcp)失败:操作超时
,因此连接尝试超时,而不是读取超时


ifconfig-a和netstat-r输出:

我想查看“ifconfig-a”的输出

这闻起来像是本地配置问题;我无法在OS X 10.11.4,Go 1.6上复制这一点


我的W.A.G是隧道设备实际上使用的是127.0.0.1,而不是环回设备。

是否安装了Cisco Anyconnect?如果安装了,请查找
websecurity\u uninstall.sh
并卸载websecurity

sudo /opt/cisco/anyconnect/bin/websecurity_uninstall.sh

它将端口8080转发到端口5001,您无法使用netstat、lsof或任何正常工具来查看为什么没有任何东西可以使用端口8080。

我确信您已检查此项,但您是否有数据包过滤(pfctl)或者打开了其他防火墙?请参见

我修复了它!我记得不久前我试图增加我机器上的连接限制,并应用了此处描述的更改:

恢复它们修复了问题。这是有帮助的:

sudo rm /etc/sysctl.conf
sudo sysctl kern.ipc.somaxconn=128
sudo rm /Library/LaunchDaemons/limit.maxproc.plist
sudo rm /Library/LaunchDaemons/limit.maxfiles.plist
顺便说一句:经过进一步调查,我发现:

  • 问题是accept()syscall每次都返回EAGAIN,但不接受任何连接
  • 对于C和Java程序中的非阻塞连接,它的行为相同

但是我仍然不知道它到底是怎么坏的。

当你只在没有ip地址的情况下收听
:8080时会发生什么?同样的,也在其他界面上尝试过。你是否检查了
ListendServe
?tcp4 0 0 127.0.0.1:8080是否返回了错误。听着,tcp4 0 0 127.0.0.1:53123 127.0.0.1:8080 SYN_SENTOS X版本?Go version?我无法在10.11.4 w/Go 1.6上复制。没有。我也尝试了其他端口,这与问题相同。是否有可能您正在链接一个本地修改的net/http包?我不这么认为。根本问题是docker机器无法连接到它的rpc服务器,我刚刚获取了docker机器的二进制版本。我后来尝试自己构建并调试它,并将问题简化为我在本问题中描述的问题。没有。我卸载了防火墙,但它没有任何帮助。
sudo rm /etc/sysctl.conf
sudo sysctl kern.ipc.somaxconn=128
sudo rm /Library/LaunchDaemons/limit.maxproc.plist
sudo rm /Library/LaunchDaemons/limit.maxfiles.plist