第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取本地計算機的IP地址

獲取本地計算機的IP地址

C++
開滿天機 2019-10-09 16:30:43
在C ++中,獲取本地計算機的IP地址和子網(wǎng)掩碼的最簡單方法是什么?我希望能夠在本地網(wǎng)絡中檢測本地計算機的IP地址。在我的特定情況下,我的子網(wǎng)掩碼為255.255.255.0,計算機的IP地址為192.168.0.5。我需要以編程方式使它們具有兩個值,以便將廣播消息發(fā)送到我的網(wǎng)絡(對于我的特殊情況,格式為192.168.0.255)編輯:許多答案沒有給出我期望的結果,因為我有兩個不同的網(wǎng)絡IP。Torial的代碼成功了(它給了我兩個IP地址)。謝謝。
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

所有基于gethostbyname的方法的問題在于,您不會獲得分配給特定計算機的所有IP地址。服務器通常具有多個適配器。


這是一個如何遍歷主機上所有Ipv4和Ipv6地址的示例:


void ListIpAddresses(IpAddresses& ipAddrs)

{

  IP_ADAPTER_ADDRESSES* adapter_addresses(NULL);

  IP_ADAPTER_ADDRESSES* adapter(NULL);


  // Start with a 16 KB buffer and resize if needed -

  // multiple attempts in case interfaces change while

  // we are in the middle of querying them.

  DWORD adapter_addresses_buffer_size = 16 * KB;

  for (int attempts = 0; attempts != 3; ++attempts)

  {

    adapter_addresses = (IP_ADAPTER_ADDRESSES*)malloc(adapter_addresses_buffer_size);

    assert(adapter_addresses);


    DWORD error = ::GetAdaptersAddresses(

      AF_UNSPEC, 

      GAA_FLAG_SKIP_ANYCAST | 

        GAA_FLAG_SKIP_MULTICAST | 

        GAA_FLAG_SKIP_DNS_SERVER |

        GAA_FLAG_SKIP_FRIENDLY_NAME, 

      NULL, 

      adapter_addresses,

      &adapter_addresses_buffer_size);


    if (ERROR_SUCCESS == error)

    {

      // We're done here, people!

      break;

    }

    else if (ERROR_BUFFER_OVERFLOW == error)

    {

      // Try again with the new size

      free(adapter_addresses);

      adapter_addresses = NULL;


      continue;

    }

    else

    {

      // Unexpected error code - log and throw

      free(adapter_addresses);

      adapter_addresses = NULL;


      // @todo

      LOG_AND_THROW_HERE();

    }

  }


  // Iterate through all of the adapters

  for (adapter = adapter_addresses; NULL != adapter; adapter = adapter->Next)

  {

    // Skip loopback adapters

    if (IF_TYPE_SOFTWARE_LOOPBACK == adapter->IfType)

    {

      continue;

    }


    // Parse all IPv4 and IPv6 addresses

    for (

      IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress; 

      NULL != address;

      address = address->Next)

    {

      auto family = address->Address.lpSockaddr->sa_family;

      if (AF_INET == family)

      {

        // IPv4

        SOCKADDR_IN* ipv4 = reinterpret_cast<SOCKADDR_IN*>(address->Address.lpSockaddr);


        char str_buffer[INET_ADDRSTRLEN] = {0};

        inet_ntop(AF_INET, &(ipv4->sin_addr), str_buffer, INET_ADDRSTRLEN);

        ipAddrs.mIpv4.push_back(str_buffer);

      }

      else if (AF_INET6 == family)

      {

        // IPv6

        SOCKADDR_IN6* ipv6 = reinterpret_cast<SOCKADDR_IN6*>(address->Address.lpSockaddr);


        char str_buffer[INET6_ADDRSTRLEN] = {0};

        inet_ntop(AF_INET6, &(ipv6->sin6_addr), str_buffer, INET6_ADDRSTRLEN);


        std::string ipv6_str(str_buffer);


        // Detect and skip non-external addresses

        bool is_link_local(false);

        bool is_special_use(false);


        if (0 == ipv6_str.find("fe"))

        {

          char c = ipv6_str[2];

          if (c == '8' || c == '9' || c == 'a' || c == 'b')

          {

            is_link_local = true;

          }

        }

        else if (0 == ipv6_str.find("2001:0:"))

        {

          is_special_use = true;

        }


        if (! (is_link_local || is_special_use))

        {

          ipAddrs.mIpv6.push_back(ipv6_str);

        }

      }

      else

      {

        // Skip all other types of addresses

        continue;

      }

    }

  }


  // Cleanup

  free(adapter_addresses);

  adapter_addresses = NULL;


  // Cheers!

}


查看完整回答
反對 回復 2019-10-09
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您可以使用gethostname后跟gethostbyname來獲取本地接口內部IP。


該返回的IP可能與您的外部IP不同。要獲取外部IP,您必須與外部服務器通信,該服務器將告訴您外部IP是什么。因為外部IP不是您的,而是您的路由器。


//Example: b1 == 192, b2 == 168, b3 == 0, b4 == 100

struct IPv4

{

    unsigned char b1, b2, b3, b4;

};


bool getMyIP(IPv4 & myIP)

{

    char szBuffer[1024];


    #ifdef WIN32

    WSADATA wsaData;

    WORD wVersionRequested = MAKEWORD(2, 0);

    if(::WSAStartup(wVersionRequested, &wsaData) != 0)

        return false;

    #endif



    if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR)

    {

      #ifdef WIN32

      WSACleanup();

      #endif

      return false;

    }


    struct hostent *host = gethostbyname(szBuffer);

    if(host == NULL)

    {

      #ifdef WIN32

      WSACleanup();

      #endif

      return false;

    }


    //Obtain the computer's IP

    myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1;

    myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2;

    myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3;

    myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4;


    #ifdef WIN32

    WSACleanup();

    #endif

    return true;

}

您也可以始終只使用127.0.0.1,它始終代表本地計算機。


Windows中的子網(wǎng)掩碼:


您可以通過查詢以下注冊表項的子項來獲取子網(wǎng)掩碼(以及網(wǎng)關和其他信息):


HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces


查找注冊表值SubnetMask。


在Windows中獲取接口信息的其他方法:


您還可以通過以下方式檢索所需的信息: WSAIoctl,帶有以下選項:SIO_GET_INTERFACE_LIST


查看完整回答
反對 回復 2019-10-09
  • 3 回答
  • 0 關注
  • 518 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號