【问题标题】:get external IP address through a c function通过c函数获取外部IP地址
【发布时间】:2016-07-22 21:38:29
【问题描述】:

我有两个问题...

1.)是否可以使用 c 函数获取我的外部 IP 地址?

2.) 如果设备正在监听()端口(使用 struct sockaddr_in servAddr; servAddr.sin_addr.s_addr=htonl(INADDR_ANY);) 外部 IP 地址会是从另一台设备连接()的 IP 地址吗?

【问题讨论】:

  • 如果系统有多个“外部IP地址”怎么办?今天的许多系统可以有多个接口卡。唯一可靠的方法是已经有连接,然后在连接的套接字上调用getsockname 以查看连接使用的接口IP 地址。同样INADDR_ANY 表示监听所有接口,本地或外部,不管有多少。

标签: c networking


【解决方案1】:

是否可以使用 c 函数获取我的外部 IP 地址?

这可能是XY problem。您的问题的简短回答是“不”。

如果您尝试获取外部 IP 地址,可能是因为您在 nat 后面并且想要运行服务器。假设您知道 port forwarding 是什么并且可以在您的 nat 框中设置它,您需要知道您的外部 IP 地址,以便您可以实际连接到您的服务器。

您可以使用许多公共服务来获取您的外部 IP 地址。一种想法是设置免费的dynamic dns。另一个想法是从 Internet 上的服务中获取您的外部 IP。

如果你向http://ip-api.com/json发送一个HTTP get请求,你会得到back一个你可以解析的json结构:

A successful request will return, by default, the following:

{
    "status": "success",
    "country": "COUNTRY",
    "countryCode": "COUNTRY CODE",
    "region": "REGION CODE",
    "regionName": "REGION NAME",
    "city": "CITY",
    "zip": "ZIP CODE",
    "lat": LATITUDE,
    "lon": LONGITUDE,
    "timezone": "TIME ZONE",
    "isp": "ISP NAME",
    "org": "ORGANIZATION NAME",
    "as": "AS NUMBER / NAME",
    "query": "IP ADDRESS USED FOR QUERY"
}

C 不是最好的语言。 python 实现可以是:

import urllib2,json
j=json.load(urllib2.urlopen('http://ip-api.com/json'))
print(j['query'])

如果你真的想用 C 来编写这个代码,那么看看 Jerry 的出色 post 编写一个小程序来执行 HTTP get/post。您还需要查看json.org 上的一些 C json 解析器。

如果设备正在侦听()端口(使用 struct sockaddr_in servAddr; servAddr.sin_addr.s_addr=htonl(INADDR_ANY);),外部 IP 地址是否会是来自另一台设备的 connect() IP 地址?

是的,如果另一台设备位于您的 nat 框的远端并且您已设置端口转发。

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2010-09-09
    • 2013-04-03
    • 2016-03-10
    • 2017-01-26
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多