Windows Local Host IPv4 주소 찾기.
IPv4의 주소를 알아보는 방법을 얻기 위해서, popen을 사용하는 방법을 찾았었다.
하지만, 이것이 생각보다 불편하다.(각 열을 분석해서 출력해야되는 문제점이 있다.
그래서 구글링을 해보니, gethostbyname라는 함수가 있다는 걸 알게 되었다. 1
예시 사이트들이 많이 있는데, 그 중에 하나의 소스를 사용하고자 한다.
예시 사이트 :
http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancednsrnr8e.html
http://www.tenouk.com/Winsock/Winsock2example7.html
http://stackoverflow.com/questions/26888853/ip-address-order-in-gethostbyname-function
gethostbyname이라는 함수는 ipv4에 맞춰서 데이터를 가지는 구조체를 가지게 해주고, 해당 구조체에서 inet_ntoa 함수를 사용해서 십진수 3자리 4블럭으로 된 문자열을 출력한다.
이걸 이용하면, 간단하게 현재 설정되어 있는 IPv4 값을 얻을 수 있게 되고, 이걸 이용해서 자동으로 ip을 생성하는 소스를 짤 수 있게 된다.
다음은 예시 사이트에서 있는 답변 중 하나를 가지고 왔다.
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <winsock.h> #pragma comment(lib, "Ws2_32.lib") int main() { char hostname[255]; struct hostent *he; struct in_addr **addr_list; WSAData data; WSAStartup(MAKEWORD(2, 2), &data); gethostname(hostname, 255); std::cout << "Host name: " << hostname << std::endl; if ((he = gethostbyname(hostname)) == NULL) { std::cout << "gethostbyname error" << std::endl; } else { std::cout << "IP addresses: " << std::endl; addr_list = (struct in_addr **)he->h_addr_list; for(int i = 0; addr_list[i] != NULL; i++) { std::cout << inet_ntoa(*addr_list[i]) << std::endl; } } return 0; } | cs |
예시를 보면, 알겠지만, ws2_32.lib을 사용해줘야 한다.
만약, #pragma comment(lib, "Ws2_32.lib")을 넣지 않으면, 사용자가 일일히 lib을 연결시켜 줘야 한다.
예제
gcc -o winsock winsock.c -lws2_32
이렇게 사용하는 것이다.
- https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738524(v=vs.85).aspx(2016-06-06) [본문으로]