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.
--------------------------------------------------------------------
このブログから、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; }