獲取本機用於連線的IP地址
阿新 • • 發佈:2019-01-11
最近寫個程式需要獲取本機用於連線的IP地址,經過很多的嘗試後,最終使用的方法如下:
- 使用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 }