可能重复:
以编程方式发现公共 IP
有没有办法从 C 程序中知道我的公共 IP 地址?我正在使用 DSL 调制解调器并在 Linux 操作系统上工作。
我需要知道公共 IP,这样我才能使服务器-客户端套接字程序在 Internet 上工作。
可能重复:
以编程方式发现公共 IP
有没有办法从 C 程序中知道我的公共 IP 地址?我正在使用 DSL 调制解调器并在 Linux 操作系统上工作。
我需要知道公共 IP,这样我才能使服务器-客户端套接字程序在 Internet 上工作。
从您的问题中不清楚您是否在路由器后面,但如果不是,我认为这不是重复的。
如果您在路由器后面,那么除非路由器已经配置为转发到您的机器,否则知道路由器的公共 IP 地址几乎是无用的。
如果您不在路由器后面,问题很简单。只需创建一个 UDP 套接字并将connect
其连接到任何非本地 IP 地址,然后调用getsockname
套接字。结果sockaddr_in
将包含用于发送到该地址的 IP 地址,即您的“公共 IP 地址”。8.8.8.8
与任何 dns“根服务器”一样,这将是一个不错的简单地址选择。请记住,您不必向它发送任何数据包(这就是您使用 UDP 而不是 TCP 的原因),只需connect
一个无连接套接字即可。
是的,您可以使用STUN 协议向 STUN 服务器询问它认为您的请求来自哪个 IP 地址。您可以使用几个开放的 STUN 服务器,例如 stunserver.org。