
利用
gethostname()
函数可以获取主机名,使用
gethostbyname()
函数查询主机名对应的 IP 地址。获取到的 IP 地址是以或开头的,则表示是本地 IP 地址。
getaddrinfo()
函数可以根据主机名或 IP 地址获取相关的地址信息。获取到的地址信息中包含字段的
AI_ADDRCONFIG
标志,则表示该 IP 地址是可用的外网 IP 地址。
getifaddrs()
函数可以获取系统中所有网络接口的地址信息。可以通过遍历这些地址信息,判断字段是否以或开头来区分本地 IP 地址和外网 IP 地址。
在 Windows 系统中,可以使用
WSAIoctl()
函数获取网络接口的信息,并判断字段是否为
IF_TYPE_LOOPBACK
来区分本地 IP 地址和外网 IP 地址。
在 C 程序中区分本地 IP 地址和外网 IP 地址可以通过多种方法实现,包括使用
gethostname()
、
getaddrinfo()
、
getifaddrs()
和
WSAIoctl()
等函数。每种方法都有其适用的场景和特点,开发者可以根据实际需求选择合适的方法。
如何区分IP地址类型?
1.A类IP地址。 地址范围从1.0.0.0 到126.0.0.0。
2. B类IP地址。 地址范围从128.0.0.0到191.255.255.255。
3. C类IP地址。 范围从192.0.0.0到223.255.255.255。
4. D类地址用于多点广播(Multicast)。
拓展资料:
网络互连设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元的格式不同。
IP协议实际上是一套由软件、程序组成的协议软件,它把各种不同“帧”统一转换成“网协数据包”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点。
本地ip和网络ip
答案:
本地IP和网络IP是两个不同的概念。
解释:
一、本地IP
本地IP地址,也称为私有IP地址,是在内部网络中分配给设备的地址。 这个IP地址用于计算机或其他设备与本地网络中的其他设备通信。 常见的本地IP地址包括IPv4中的A类、B类、C类私有地址范围。 这些地址不具备全球唯一性,只在特定局域网内部有效。 因此,即使多台设备使用相同的本地IP地址,也不会发生冲突,因为它们所处的网络环境不同。 当设备需要连接到外部网络时,通过路由器等设备进行NAT处理,将本地IP转换为全局IP进行通信。
二、网络IP
网络IP地址,也称为公共IP地址或全球IP地址,是用于在互联网上识别设备的唯一标识。 每台连接到互联网的计算机或其他设备都有一个网络IP地址,该地址是唯一的,全球范围内不可重复。 这个IP地址允许互联网上的其他设备能够准确地找到和与您的设备进行通信。 网络IP地址通常需要配合域名解析系统进行工作,将域名转化为实际的网络IP地址以便定位和访问特定网站或服务。 在小型网络中,通常只有一台服务器或路由器拥有公共IP地址,而内部设备通过NAT技术共享这个公共IP进行互联网访问。 因此,当您浏览网页或使用在线服务时,服务器接收到的实际上是您的公共IP地址信息。
总结来说,本地IP用于局域网内部通信,而网络IP用于全球互联网通信。 两者通过路由器等设备关联和转换,确保设备可以在不同的网络环境中正确地进行数据传输和通信。
C#程序怎么获得外网IP和内网IP?
1、企业网内部的工作站通过出口路由器的NAT转换能够上Internet网。 2、企业网(目前来说大部分是教育网)内部有一些服务器,如图中的Server,本身具有私网IP地址10.0.0.3,而且需要被公网所访问,所以需要在企业网的出口处对其做静态NAT转换,将其转换为一个公网IP地址2.0.0.5。 企业外部的公网用户通过该服务器公网IP或解析后的域名对其进行访问,而企业内部的工作站如果使用公网上的一台DNS,那么也将使用域名对该服务器进行访问。 3、企业网(目前来说大部分是教育网)内部还有一些服务器,如图中的Game-Server,它本身具有公网IP地址,它也既需要被私网用户所访问,也需要被公网用户所访问。 三、解决方案1、常规配置:就按照拓扑图中的配置方法,WorkStation应该是可以访问到服务器Server的,只不过需要公网路由器的参与。 具体过程是WorkStation发出一个以Server的公网IP(2.0.0.5)为目标地址的数据包,源地址是10.0.0.2,这个数据包经过Router时,它会首先遵从路由表进行路由, 2.0.0.5这个地址虽然属于运营商分给我们的一段公网IP的一部分,但由于该地址并不与任何接口同属一个网段,所以路由器只会按照缺省路由路由这个数据包到公网路由器,从物理端口向外发出时,NAT会起作用,这个数据包的源IP会被替换为2.0.0.1(地址池里的第一个地址)。 当公网路由器收到这个数据包时,它查目标地址所在网段,发现这个地址已经被分给该企业网,所以会遵从那条路由将该数据包发回到Router。 此时这个数据包的源IP是2.0.0.1,目标IP为2.0.0.5,Router查NAT表发现2.0.0.5这个公网IP应按照配置了的静态NAT表项转换为10.0.0.3,所以当路由器把这个数据包发给Server时,数据包的目的IP就被转换成了10.0.0.3,而源IP仍为2.0.0.1。 当Server回复这个数据包时也按照对等的方式返回WorkStation。 总结地说,就是这个过程是需要公网路由器参与完成的,而公网设备对我们来说是不可控的,所以当公网路由器因为某种原因拒绝参与这个过程时(比如出口链路断),这种访问方式将变为不可行。 而且数据包要在企业网与公网的路由器之间走了一个环,浪费了带宽及设备的性能资源。 采用这种方法时,我从WorkStation上用tracert命令数据包的行走路径,更清晰地反应了这一过程:C:\Documents and Settings\bluephoenix>tracert 2.0.0.5Tracing route to 2.0.0.5 over a maximum of 30 hops1<1 ms<1 ms<1 ms 10.0.0.12<1 ms<1 ms<1 ms 1.1.1.23 *** Request timed out.4 3 ms 3 ms 3 ms 2.0.0.52、DNS解析不论私网用户和公网用户他们访问服务器时实际上一般都是通过DNS来完成的。 让私网用户将DNS指向私网内的一台可管理DNS也可以解决这个问题,即修改DNS中关于Server的解析记录,让其指向Server的私网IP即可,改过之后用户就可以使用通常的域名对该服务器进行访问了,只不过该过程是透明的,用户并不知道已经使用了私网IP在进行访问。 这种方法对我们来说比较轻松,没有给我们增加维护成本,请大家尽量说服用户采用这样的方法,但该方法应用场合有限,如果私网用户非要使用公网IP地址而不是域名来对Server进行访问,这种方法就行不通了,那就必须采取第三种方法。 3、loopback与策略路由法Router的配置步骤为:(1) 建立loopback接口,随便配置一个IP地址,并将其设为ip nat ouse(2) 建立Access-list,用来匹配私网客户端访问Server以及Server做回应的数据流(3) 定义policy-route table,设置策略缺省路由指向loopback接口,设置ip policy-route enable。 (4) 定义route-map,设定匹配Access-list的数据流都使用策略路由;并将这一route-map应用到接口。 (5) 建立一个null 0接口,并由ip nat pool所形成的路由指向null 0接口,以防止不能命中NAT规则的报文在企业网路由器和公网路由器之间震荡。 (这一步不是必须的,但为了稳定起见,建议作这一步;另外只能在这种方法中使用指向null 0的路由,如果在第一种方法中使用了,那么数据包将不会在企业网路由器和公网路由器之间环游一周,而直接被陷在企业网路由器中了,将导致第一种方法失败。 )