티스토리 뷰

프로그래밍/API

네트워크 상태 조회

에어버스 2020. 6. 24. 10:56

https://docs.microsoft.com/ko-kr/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses?redirectedfrom=MSDN

 

GetAdaptersAddresses function (iphlpapi.h) - Win32 apps

Retrieves the addresses associated with the adapters on the local computer.

docs.microsoft.com

추가>
프로그램 실행할때 인수를 전달해야 하는데 잘 작동안되어
아래 코드에서 46~57행을 주석처리하고  바로 안래에 family = AF_INET; 을 추가해서 실행함.

공유기에서 포트 속도를 100MBps 로 수동 설정하고 실행하면 100,000,000

공유기에서 자동으로 1GBps 로 되어 있으면 1,000,000,000

 

 

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
 
// Link with Iphlpapi.lib
#pragma comment(lib, "IPHLPAPI.lib")
 
#define WORKING_BUFFER_SIZE 15000
#define MAX_TRIES 3
 
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
 
/* Note: could also use malloc() and free() */
 
int __cdecl main(int argc, char** argv)
{
 
    /* Declare and initialize variables */
 
    DWORD dwSize = 0;
    DWORD dwRetVal = 0;
 
    unsigned int i = 0;
 
    // Set the flags to pass to GetAdaptersAddresses
    ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
 
    // default to unspecified address family (both)
    ULONG family = AF_UNSPEC;
 
    LPVOID lpMsgBuf = NULL;
 
    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
    ULONG outBufLen = 0;
    ULONG Iterations = 0;
 
    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
    PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
    PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
    IP_ADAPTER_DNS_SERVER_ADDRESS* pDnServer = NULL;
    IP_ADAPTER_PREFIX* pPrefix = NULL;
 
    if (argc != 2) {
        printf(" Usage: getadapteraddresses family\n");
        printf("        getadapteraddresses 4 (for IPv4)\n");
        printf("        getadapteraddresses 6 (for IPv6)\n");
        printf("        getadapteraddresses A (for both IPv4 and IPv6)\n");
        exit(1);
    }
 
    if (atoi(argv[1]) == 4)
        family = AF_INET;
    else if (atoi(argv[1]) == 6)
        family = AF_INET6;
 
    printf("Calling GetAdaptersAddresses function with family = ");
    if (family == AF_INET)
        printf("AF_INET\n");
    if (family == AF_INET6)
        printf("AF_INET6\n");
    if (family == AF_UNSPEC)
        printf("AF_UNSPEC\n\n");
 
    // Allocate a 15 KB buffer to start with.
    outBufLen = WORKING_BUFFER_SIZE;
 
    do {
 
        pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
        if (pAddresses == NULL) {
            printf
            ("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
            exit(1);
        }
 
        dwRetVal =
            GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
 
        if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
            FREE(pAddresses);
            pAddresses = NULL;
        }
        else {
            break;
        }
 
        Iterations++;
 
    } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES));
 
    if (dwRetVal == NO_ERROR) {
        // If successful, output some information from the data we received
        pCurrAddresses = pAddresses;
        while (pCurrAddresses) {
            printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
                pCurrAddresses->Length);
            printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
            printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);
 
            pUnicast = pCurrAddresses->FirstUnicastAddress;
            if (pUnicast != NULL) {
                for (i = 0; pUnicast != NULL; i++)
                    pUnicast = pUnicast->Next;
                printf("\tNumber of Unicast Addresses: %d\n", i);
            }
            else
                printf("\tNo Unicast Addresses\n");
 
            pAnycast = pCurrAddresses->FirstAnycastAddress;
            if (pAnycast) {
                for (i = 0; pAnycast != NULL; i++)
                    pAnycast = pAnycast->Next;
                printf("\tNumber of Anycast Addresses: %d\n", i);
            }
            else
                printf("\tNo Anycast Addresses\n");
 
            pMulticast = pCurrAddresses->FirstMulticastAddress;
            if (pMulticast) {
                for (i = 0; pMulticast != NULL; i++)
                    pMulticast = pMulticast->Next;
                printf("\tNumber of Multicast Addresses: %d\n", i);
            }
            else
                printf("\tNo Multicast Addresses\n");
 
            pDnServer = pCurrAddresses->FirstDnsServerAddress;
            if (pDnServer) {
                for (i = 0; pDnServer != NULL; i++)
                    pDnServer = pDnServer->Next;
                printf("\tNumber of DNS Server Addresses: %d\n", i);
            }
            else
                printf("\tNo DNS Server Addresses\n");
 
            printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
            printf("\tDescription: %wS\n", pCurrAddresses->Description);
            printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName);
 
            if (pCurrAddresses->PhysicalAddressLength != 0) {
                printf("\tPhysical address: ");
                for (i = 0; i < (int)pCurrAddresses->PhysicalAddressLength;
                    i++) {
                    if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                        printf("%.2X\n",
                            (int)pCurrAddresses->PhysicalAddress[i]);
                    else
                        printf("%.2X-",
                            (int)pCurrAddresses->PhysicalAddress[i]);
                }
            }
            printf("\tFlags: %ld\n", pCurrAddresses->Flags);
            printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
            printf("\tIfType: %ld\n", pCurrAddresses->IfType);
            printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
            printf("\tIpv6IfIndex (IPv6 interface): %u\n",
                pCurrAddresses->Ipv6IfIndex);
            printf("\tZoneIndices (hex): ");
            for (i = 0; i < 16; i++)
                printf("%lx ", pCurrAddresses->ZoneIndices[i]);
            printf("\n");
 
            printf("\tTransmit link speed: %I64u\n", pCurrAddresses->TransmitLinkSpeed);
            printf("\tReceive link speed: %I64u\n", pCurrAddresses->ReceiveLinkSpeed);
 
            pPrefix = pCurrAddresses->FirstPrefix;
            if (pPrefix) {
                for (i = 0; pPrefix != NULL; i++)
                    pPrefix = pPrefix->Next;
                printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
            }
            else
                printf("\tNumber of IP Adapter Prefix entries: 0\n");
 
            printf("\n");
 
            pCurrAddresses = pCurrAddresses->Next;
        }
    }
    else {
        printf("Call to GetAdaptersAddresses failed with error: %d\n",
            dwRetVal);
        if (dwRetVal == ERROR_NO_DATA)
            printf("\tNo addresses were found for the requested parameters\n");
        else {
 
            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                // Default language
                (LPTSTR)&lpMsgBuf, 0NULL)) {
                printf("\tError: %s", lpMsgBuf);
                LocalFree(lpMsgBuf);
                if (pAddresses)
                    FREE(pAddresses);
                exit(1);
            }
        }
    }
 
    if (pAddresses) {
        FREE(pAddresses);
    }
 
    return 0;
}
cs

 

실행결과>

Calling GetAdaptersAddresses function with family = AF_UNSPEC

        Length of the IP_ADAPTER_ADDRESS struct: 376
        IfIndex (IPv4 interface): 11
        Adapter name: {68A7A23A-****-****-****-************}
        Number of Unicast Addresses: 2
        No Anycast Addresses
        Number of Multicast Addresses: 10
        Number of DNS Server Addresses: 2
        DNS Suffix:
        Description: Intel(R) Ethernet Connection (2) I219-LM
        Friendly name:  Physical address: DC-4A-3E-**-**-**
        Flags: 449
        Mtu: 1500
        IfType: 6
        OperStatus: 1
        Ipv6IfIndex (IPv6 interface): 11
        ZoneIndices (hex): b b b b 1 1 1 1 1 1 1 1 1 1 0 1
        Transmit link speed: 1000000000
        Receive link speed: 1000000000
        Number of IP Adapter Prefix entries: 8

        Length of the IP_ADAPTER_ADDRESS struct: 376
        IfIndex (IPv4 interface): 1
        Adapter name: {6902070E-****-****-***-************}
        Number of Unicast Addresses: 2
        No Anycast Addresses
        Number of Multicast Addresses: 2
        Number of DNS Server Addresses: 3
        DNS Suffix:
        Description: Software Loopback Interface 1
        Friendly name: Loopback Pseudo-Interface 1
        Flags: 385
        Mtu: 4294967295
        IfType: 24
        OperStatus: 1
        Ipv6IfIndex (IPv6 interface): 1
        ZoneIndices (hex): 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
        Transmit link speed: 1073741824
        Receive link speed: 1073741824
        Number of IP Adapter Prefix entries: 7

        Length of the IP_ADAPTER_ADDRESS struct: 376
        IfIndex (IPv4 interface): 21
        Adapter name: {F3342027-****-****-****-************}
        Number of Unicast Addresses: 2
        No Anycast Addresses
        Number of Multicast Addresses: 8
        Number of DNS Server Addresses: 3
        DNS Suffix:
        Description: Hyper-V Virtual Ethernet Adapter
        Friendly name: vEthernet (Default Switch)
        Physical address: 00-15-5D-**-**-**
        Flags: 448
        Mtu: 1500
        IfType: 6
        OperStatus: 1
        Ipv6IfIndex (IPv6 interface): 21
        ZoneIndices (hex): 15 15 15 15 1 1 1 1 1 1 1 1 1 1 0 1
        Transmit link speed: 10000000000
        Receive link speed: 10000000000
        Number of IP Adapter Prefix entries: 8

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 30 31