公司里要用C#做一个TCP数据接收处理模块,现在先用花生壳免费域名做测试,写一个通过域名访问的客户端连接。如下: string strIP = Dns.GetHostEntry("sccgsqs.vicp.cc").AddressList[0].ToString(); IPAddress ip = IPAddress.Parse(strIP); IPEndPoint ipEnd = new IPEndPoint(ip, port); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //尝试连接 try { socket.Connect(ipEnd); } 但是连接Connect机器服务端口(已经开启)时都不行(包括监听服务和客户端在本机和不同机器上都不行): 1、如果没有激活或者是没有开启花生壳映射,则解析获取的strIP为:125.141.245.202,和花生壳提示的域名IP地址指向是一样的,和ip138.com尚查看到的也是一样的。 2、如果花生壳开启了映射,域名IP地址指向则每次可能都不同,如图,当次为24.15.22.40,多测试几次,见过和条目1中一样的,也有过88.*.*.*等形式的IP,即是在变化的,但这几次测试,ipconfig读取的内网IP是没有变化的。 而开启映射这种情况代码解析获取到的strIP为:202.105.21.248,和花生壳的MX指向IP地址是一样的,和在ip138.com上查看的是一样的,并且在家里和单位里一直都是这个IP,感觉是和域名一样固定下来了。 现在的问题是,域名IP地址指向是不是就是我当前对应的外网IP呢,那么激活后映射的MX的IP地址又到底是什么呢,为什么我不管是在公司登录还是家里登录(设置映射的内网IP是ipconfig读取出来的),这个MX指向的IP地址都没有变化呢,特别是设置映射后代码中解析出来的IP是这个MX指向地址。晕啊。 不管解析出的到底是哪个IP地址,我想要的是如何通过这个域名使用TCP方式连接到监听服务端,还有什么地方没考虑到呢? 另,服务器端IIS发布WEB网页,花生壳客户端开启时其它外网机器是可以通过这个sccgsqs.vicp.cc域名进行访问的,但不知道为什么 现在写socket客户端连接不行呢? |
你所说的这个问题应该是涉及到NAT转发的问题,请在连接外网的路由器或网关设备上做端口映射,将使用的端口做相应的映射。
谢谢你,我看了一上午,基本上也弄明白是这么个思路,但有另一个问题:我这里是公司单独拉进来的一根电线的专线,华为的一个型号为HG8210C的一个设备,应该接入的是光纤,上面接入有光信号指示、接出有网口1、网口2,还有固话语音口和IPTV等,也就是说,我不知道这算不算路由器,现在电脑就我这一台接入的,而且通过192.168.1.1登录到这个设备中,里面很简单,也没有虚拟服务器、NAT之类的设置。这种差不多直接连的设备如何设置端口映射呢,或者是我可以把它理解成以前的猫,直接连上电脑上网,如何设置端口映射。
还有一种情况是,外网接入进来,先接入交换机,交换机再分发接向路由器,要实现外网访问的电脑接在该路由器上,也即内网有多级路由,那是不是交换机和路由器都要分别进行映射才可以呢
@摩根鱼: 那要看你本机的ip地址是不是公网地址,如果说的话,应该就不用映射了。如果说有很多级的路由的话,应该是需要每一个节点做一次映射。
@sinhbv: 嗯,谢谢,基本搞明白一些了,确实是被电信NAT了,这个ipconfig中读取出来的并不是是公网IP,而花生壳解析出来的、C#中Dns.GetHostEntry("sccgsqs.vicp.cc").AddressList[0].ToString()读取出来的和ip138.com查询出来的是一致的,才是真正的公网IP,不过我好奇的是为什么外网机器通过域名访问我的IIS页面是可以的呢?
@摩根鱼: 也许是花生壳的客户端访问其服务器端,进行了NAT穿透。
楼上正解。你一定是使用共享路由了,所分配的ip是私有地址。要做端口映射。
直接用IP能连接吗?
说实话,我没看明白,不过我有个方法,假设你有台服务 A 使用了花生壳域名解析,然后你在 A 的 IIS 上部署一个静态页面 test.txt,然后你在测试机上去打开IE,输入此页面的 url 地址,如果能够正确打开,那么你可以用抓包工具把整个过程都抓下来,你分析下 TCP 包,你就知道你的程序该怎么写了;如果打不开的话,那就是你的花生壳设置不对。
做花生壳的内网穿透 配置IIS 然后客户端的socket("域名":外网端口) 服务端(内网端口) 刚刚实验成功
兄弟,试了你的方法,我也成功了,谢谢
谢谢! 搞了一天,按你说的方式完美解决了
想请问一下这是为什么呀?