【问题标题】:How to get the inet address at the startup? [closed]启动时如何获取inet地址? [关闭]
【发布时间】:2012-01-13 08:21:53
【问题描述】:

我正在编写一个教学客户端-服务器游戏。我想当服务器启动时,它会在屏幕上打印一个inet 地址。我知道一台机器可以有多个inet 地址,但我只需要一个,并且可以轻松获得。

编辑: 在测试客户端-服务器交互期间,我使用地址 127.0.0.1。现在我想通过互联网测试客户端在另一台机器上时的客户端-服务器交互。为此,我必须从服务器程序获取 IP 地址(我希望服务器在屏幕上打印一个 inet 地址)并将其提供给客户端程序。很抱歉造成误会。

【问题讨论】:

  • 使用这个,它是免费的:127.0.0.1
  • 太糟糕了,你至少会有两个:上面提到的环回地址(虽然它只对本地流量有用),以及物理网卡地址(可能更多)。您需要遍历所有这些并选择最有可能的一个。
  • 当你 bind 套接字时,不要使用特定的 IP 地址,而是使用 INADDR_ANY。然后您的服务器将侦听所有接口上的连接(即机器上的所有 IP 地址)。
  • 为什么这个问题被否决了?在 C 中获取您自己的网络地址并不是一目了然,而且很多提出问题的方法都没有得到很好的回应。

标签: c network-programming


【解决方案1】:

您需要 gethostnamegethostbyname 函数,以及 inet_ntoa 将其打印出来:

struct hostent *HostEntPtr;
struct in_addr in;
char           Hostname[100];

gethostname( Hostname, sizeof(Hostname) );
HostEntPtr = gethostbyname( Hostname );

if ( HostEntPtr != NULL )
{
  memcpy( &in.s_addr, *HostEntPtr->h_addr_list, sizeof(in.s_addr) );
  printf( "%s\n", inet_ntoa(in) );
}

(假设这是获取您的本地 IP 地址)。

编辑: h_addr_list 是一个指针数组。上面的例子得到了第一个,但要查看全部,只需遍历数组即可:

int i = 0;
while( HostEntPtr->h_addr_list[i] != NULL )
{
  memcpy( &in.s_addr, HostEntPtr->h_addr_list[i], sizeof(in.s_addr) );
  printf( "%s\n", inet_ntoa(in) );
}

【讨论】:

  • mmm... 此代码返回 127.0.1.1
  • 这取决于您如何设置 /etc/hosts。我通常只将名称 localhost / loopback 分配给 127.0.0.1。我只针对真实的外部地址放置的实际主机名。我已经编辑了我的答案以循环数组 - 您可以在循环中检查并避免 127.0.0.1。
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 2016-05-08
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多