Jeremiahの小さいプログラムの1つ:Linuxの下で本機のIPアドレスを取得します


移動してくださいhttps://higoge.github.io/ああ、すべてのダウンロード資料はそのブログで見つけることができます.ありがとうございます. 
--------------------------------------------------------------------
このブログから、Jeremiahは自分が普段書いている簡単なプログラムや普段読んでいるオープンソースコードの中で良い方法とアプリケーションを整理します.
 
このブログは主にlive 555 MediaServerから抽出され、live 555 MediaServerを開くとローカルIPを読み取り、rtsp://とファイル名でオンデマンドアドレスを構成します.Live 555 MediaServerがローカルIPを読み出す主な方法は、TTL=0のマルチキャストパケットを送信し、このパケットを受信し、送信アドレス、すなわちネイティブアドレスを解析することである.
 
この方法では,自機の最も主要なIPアドレス(eth 0)しか得られない.すべてのIPアドレスを取得できません.
 
ピックコードは以下の通りで、操作プラットフォームはRedHat Linux ES 5、gcc 4.1である.2.
/*******************************************************************************   * Filename:        get_ip.c   * Created on:      Feb 8, 2010   * Author:          Jeremiah   * Description:         IP     *   ******************************************************************************/  #include   #include   #include   #include   #include   #include   #include   #include   #include   #include    in_addr_t ourIPAddress();  int setupDatagramSocket(uint16_t);  uint8_t socketJoinGroup(int socket, uint32_t groupAddress);  uint8_t writeSocket(int socket, struct in_addr address, uint32_t port,          uint8_t ttlArg, unsigned char *buffer, unsigned bufferSize);  int readSocket(int socket, unsigned char *buffer, unsigned bufferSize,          struct sockaddr_in *fromAddress, struct timeval *timeout);  int blockUntilReadable(int socket, struct timeval* timeout);  uint8_t badAddress(uint32_t addr);  uint8_t socketLeaveGroup(int socket, uint32_t groupAddress);  uint8_t IsMulticastAddress(uint32_t address);   #define SET_SOCKADDR_SIN_LEN(var)  #define MAKE_SOCKADDR_IN(var,adr,prt) /*adr,prt must be in network order*/\      struct sockaddr_in var;\      var.sin_family = AF_INET;\      var.sin_addr.s_addr = (adr);\      var.sin_port = (prt);\      SET_SOCKADDR_SIN_LEN(var);   int main(int argc, char **argv) {      struct sockaddr_in ourAddress;      ourAddress.sin_addr.s_addr = ourIPAddress();       if (ourAddress.sin_addr.s_addr == 0) {          printf("get local ip error!
");          return 1;      }       printf("%s
", inet_ntoa(ourAddress.sin_addr));       return 0;  }   in_addr_t ourIPAddress() {      uint32_t ourAddress = 0;      int sock = -1;      struct in_addr testAddr;      struct sockaddr_in fromAddr;      fromAddr.sin_addr.s_addr = 0;       // Get our address by sending a (0-TTL) multicast packet,      // receiving it, and looking at the source address used.      // (This is kinda bogus, but it provides the best guarantee      // that other nodes will think our address is the same as we do.)      testAddr.s_addr = inet_addr("228.67.43.92");      uint16_t testPort = 15948;      sock = setupDatagramSocket(testPort);      if (sock = 0) {          socketLeaveGroup(sock, testAddr.s_addr);          close(sock);      }       return ourAddress;  }   int setupDatagramSocket(uint16_t port) {      int reuseFlag = 1;      int newSocket = socket(AF_INET, SOCK_DGRAM, 0);      const uint8_t loop = 1;       if (newSocket  0xE00000FF && addressInHostOrder <= 0xEFFFFFFF;  }