Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用winsock解析DNS,服务器位于路由器后面_C++_Networking_Dns_Client Server_Winsock - Fatal编程技术网

C++ 使用winsock解析DNS,服务器位于路由器后面

C++ 使用winsock解析DNS,服务器位于路由器后面,c++,networking,dns,client-server,winsock,C++,Networking,Dns,Client Server,Winsock,我最近开始在windows上玩插座,遇到了一些麻烦。。 我有一个应用程序,我想找到一个具有DNS名称解析(通过internet连接)的主机 该程序设法将DNS名称解析为IP地址,但它找到的IP地址是位于运行服务器应用程序的计算机前面的路由器的IP地址(这是我所期望的,因为它是默认网关) 我的问题是,是否有一种方法可以连接到服务器应用程序,而不必在每次将服务器应用程序安装在前面有路由器的系统上时手动修改路由器的设置。。或者,唯一的方法就是将计算机的端口转发到路由器 感谢您的帮助! Thnx 如果服

我最近开始在windows上玩插座,遇到了一些麻烦。。 我有一个应用程序,我想找到一个具有DNS名称解析(通过internet连接)的主机

该程序设法将DNS名称解析为IP地址,但它找到的IP地址是位于运行服务器应用程序的计算机前面的路由器的IP地址(这是我所期望的,因为它是默认网关)

我的问题是,是否有一种方法可以连接到服务器应用程序,而不必在每次将服务器应用程序安装在前面有路由器的系统上时手动修改路由器的设置。。或者,唯一的方法就是将计算机的端口转发到路由器

感谢您的帮助!
Thnx

如果服务器位于路由器后面,则必须将路由器配置为端口转发。这是绕不开的。路由器需要知道其网络上的哪台机器将传入的客户端请求转发到任何给定端口。但是,根据路由器的类型及其功能,服务器应用程序可能能够使用uPNP或SNMP(如果可用并启用)以编程方式配置端口转发。否则,路由器必须由路由器管理员手动配置。

谢谢,非常有用!有没有方法可以确定服务器是否在C++的路由器后面?(因此,只有当它位于路由器后面时,它才会尝试自动转发端口。)没有完美的方法。但是您可以检查本地IP地址是否在RFC1918空间中(例如192.168.x.y、10.x.y.x等等)。如果是的话,你肯定是纳特的幕后黑手。如果不是,您可能不是。我会让服务器应用程序使用外部IP报告服务(例如
http://iplookup.flashfxp.com
http://automation.whatismyip.com/n09230945.asp
等),然后检索本地计算机的可用IP列表(使用
getAdapterInfo()
GetAdapterAddresses()
),然后检查报告的IP是否在该列表中找到。如果不是,则服务器机器没有直接连接到Internet(但这并不一定意味着它在路由器后面,它可以在代理或ICS后面)。