Golang TCP拨号错误:主机已关闭

net.Dial("tcp", "192.168.1.100:3000")

The above call give me dial tcp 192.168.1.100:3000: connect: host is down.

I can successfully ping the endpoint. I wonder what will be the cause of this error. What will be the possible causes of host is down?

Let me provide more details. The endpoint I am dialing to is running mysql server. And I can successfully connect to it with command line. The endpoint is host in a NAS.

Further investigation, I believe the error message is from https://github.com/golang/go/blob/60e3ebb9cba900f7b2f559b472726cee47e823c0/src/net/fd_unix.go#L94

I have found out why. This is because of firewall settings. This situation is caused by using Little Snitch which will check executable has valid code signature or not. If the executable does not have valid code signature, the request is filtered and Little Snitch will return error number 64 which mean host is down in Mac.

The error message means that no TCP connection can not be created to the given IP address at the given port. Your check with ping does not help much since ping does use ICMP to reach the host contrary to your use of TCP. A successful ping just means that the host is reachable in general but not that a TCP connection to the host on the given port will succeed. It might even be that such a connection succeeds but ping fails since it is blocked by a firewall rule.

Typical causes for the problem you see are:

  • You've used the wrong target IP and/or port.
  • There is no application listening at this port at the target machine at all, i.e. maybe you forgot to start the server or it crashed or it was configured wrongly.
  • The application is only listening on localhost and is thus not reachable from outside the machine.
  • Firewall rules either at the server machine or between client and server block access.