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(22), &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


 이렇게 사용하는 것이다.

  1. https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms738524(v=vs.85).aspx(2016-06-06) [본문으로]
Posted by JunkMam
,