我有两个问题......
1.)是否可以使用c函数获取外部IP地址?
2.如果设备是listen()到一个端口(使用struct sockaddr_in servAddr; servAddr.sin_addr.s_addr = htonl(INADDR_ANY);) 外部IP地址是否是从另一个设备连接()的IP地址?
答案 0 :(得分:0)
是否可以使用c函数获取外部IP地址?
这可能是XY problem。对你的问题的简短回答是" no"。
如果您正在尝试获取外部IP地址,则可能是因为您在nat之后并且您想要运行服务器。假设您知道port forwarding是什么并且可以在nat框中设置它,您需要知道您的外部IP地址,以便您可以实际连接到您的服务器。
您可以使用许多公共服务来获取外部IP地址。一个想法是设置免费dynamic dns。另一个想法是从互联网上的服务中获取外部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语言编写代码,那么在写一个小程序来做一个HTTP get / post时,看看Jerry的优秀post。您还想查看json.org上的一些C json解析器。
如果设备是listen()到端口(使用struct sockaddr_in servAddr; servAddr.sin_addr.s_addr = htonl(INADDR_ANY);)外部IP地址是否是从另一个设备连接()的IP地址?
是的,如果其他设备位于你自己的盒子的远端并且你设置了端口转发。