博客故事

在某项目后期,部署项目的时候,走了一些弯路,通过这篇博客把经验积累下来。

局域网、互联网切换的问题

问题代码:

var clientChannel = await SocketBootstrap.ConnectAsync("192.168.1.102", 9999);

同样的代码,在局域网中,可以正常与服务器端程序连接,但是切换到互联网环境下就会报错:

引发的异常:“System.Net.Sockets.SocketException”(位于 mscorlib.dll 中)
心跳线程连接失败: 在 System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)

看到报错,分析现象,意识到网络通讯过程出了问题,主机解析报错了。于是开始各种排查网络状况,端口状态等服务器信息。
最终,问题的原因是连接的代码有问题,要用规范的ipaddress对象去做参数进行连接,dns就能正确生效了。连接外网也就正常了。
正确代码如下:

var clientChannel = await SocketBootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse("192.168.1.102"), 29999));

win server 2012 R2端口

刚开始开放的是8888和9999端口,但是通过外网客户端死活连不上。后来通过一个实验发现了端倪。在win7上网口测试工具是可以充当server的但是服务器端就不行,10000以内的都不行,于是就在服务器端试了一下10000以后的端口,发现是可以充当服务器的。最终把外网端口的映射改为10000以后的端口,web服务与tcp服务就能正常监听了。所以对于服务器,靠前的端口不要用来当业务通讯的端口。