是否可以使用 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 框的远端并且您已设置端口转发。