1. 程式人生 > >獲取本機用於連線的IP地址

獲取本機用於連線的IP地址

  最近寫個程式需要獲取本機用於連線的IP地址,經過很多的嘗試後,最終使用的方法如下:

  1. 使用cmd命令    netstat  | findstr “192.168.6.66:3333” > D:\\localAddress.txt

    其中“192.168.6.66:3333”是我的程式連線的伺服器的ip地址,執行netstat命令後,找到其中包含了“192.168.6.66:3333”的那一行,並將結果輸出到 localAddress.txt 中,localAddress.txt中的結果可能如下圖所示

       

  2.讀取 localAddress.txt 中的內容,並解析出本機用於連線的ip地址為 192.168.4.45

  • 我是使用CreateProcess函式執行cmd命令,可以避免出現cmd命令視窗,也能等待cmd命令執行結束再往下執行。

 

  程式碼如下:

 1      std::string path =  "D:\\localAddress.txt";
 2          //建立用於儲存本機IP地址的localAddress.txt
 3         std::ofstream fout(path);
 4         if (fout) // 如果建立成功 
 5         { 
 6             fout << "" << std::endl;
7 fout.close(); // 執行完操作後關閉檔案控制代碼 8 9 std::string ptr; 10 std::string output; 11 ptr="cmd /c netstat | findstr \"192.168.6.66:3333 > "; 12 ptr += path; 13 14 STARTUPINFO si; 15 PROCESS_INFORMATION pi;
16 17 ZeroMemory(&si, sizeof(si)); 18 si.cb = sizeof(si); 19 //隱藏掉可能出現的cmd命令視窗 20 si.dwFlags = STARTF_USESHOWWINDOW; 21 si.wShowWindow = SW_HIDE; 22 ZeroMemory(&pi, sizeof(pi)); 23 24 // Start the child process. 25 if (CreateProcess(NULL, // No module name (use command line) 26 (LPSTR)(LPCTSTR)ptr.c_str(), // Command line 27 NULL, // Process handle not inheritable 28 NULL, // Thread handle not inheritable 29 FALSE, // Set handle inheritance to FALSE 30 0, // No creation flags 31 NULL, // Use parent's environment block 32 NULL, // Use parent's starting directory 33 &si, // Pointer to STARTUPINFO structure 34 &pi) // Pointer to PROCESS_INFORMATION structure 35 ) 36 { 37 38 // Wait until child process exits. 39 WaitForSingleObject(pi.hProcess, INFINITE); 40 41 std::fstream ffileTemp(path); //作為讀取檔案開啟 42 if (ffileTemp) 43 { 44 char buffer[256]; 45 while (!ffileTemp.eof()) 46 { 47 ffileTemp.getline(buffer, 256, '\n'); 48 std::string temp = buffer; 49 if (temp.find("ESTABLISHED") != std::string::npos) 50 { 51 output += temp; 52 break; 53 } 54 } 55 ffileTemp.close(); 56 } 57 58 if (output.length() > 0) 59 { 60 output.erase(0, output.find_first_not_of(" ")); 61 std::string localip, temp; 62 temp = output.substr(output.find_first_of(" ")); 63 temp.erase(0, temp.find_first_not_of(" ")); 64 temp = temp.substr(0, temp.find_first_of(" ")); 65 66 localip = temp.substr(0, temp.find_first_of(":")); //獲得ip地址 67 68 } 69 } 70 }