在C程序中获取公共/全局IP地址的最佳方法是什么?关于堆栈溢出的类似问题都建议将查询的输出刮到www.whatismyip.com或类似的东西,但这似乎不可靠,因为它们可能会改变它们的格式。
我原本以为我可以从我的路由器请求公众面向IP,这在我看来就像一个更强大的解决方案;虽然我没有明确知道如何做到这一点。我错过了什么吗?
答案 0 :(得分:6)
您可以连接到STUN服务器并获取外部IP。
我认为您可以很容易地找到适用于您的操作系统的STUN客户端的源代码。
假设你在* nix上,可以在这里找到c中的STUN客户端(这是我发现的第一个):
https://github.com/node/turn-client
下载源代码:c-stun-client-demo.c
使用$ clang c-stun-client-demo.c -o stun
(或使用gcc)
当你运行$ ./stun
时,它会告诉你
usage: ./stun <server_ip> <server_port> <local_port>
可以通过多种方式找到STUN服务器列表。谷歌搜索我发现了这个:
https://gist.github.com/zziuni/3741933
我们来看第一个:
stun.l.google.com:19302
您拥有服务器名称和服务器端口。
但是STUN客户端需要服务器地址;您可以使用nslookup
检索它:
$ nslookup stun.l.google.com
返回Address: 64.233.184.127
所以你将用:
调用该程序 $ ./stun 64.233.184.127 19302 8888
输出
Main start ...
socket opened to 64.233.184.127:19302 at local port 8888
Send data ...
Read recv ...
STUN binding resp: success !
socket closed !
ip:port = xxx.xxx.xxx.xxx:-13174
Main over.
xxx.xxx.xxx.xxx
是你的ip(它实际上是我的)
好的,它有效。
查看源代码(大约120行),了解它的工作原理并在程序中实现其功能。