이 포스트는 네이버 블로그에 올렸던 포스트를 가져온 것입니다.
URL에서 host부분을 이용하여 IP와 PORT 등등 여러 가지 정보를 알아내기 위해 사용합니다.
MSDN을 참고한 함수 원형은 아래와 같습니다.
int WSAAPI getaddrinfo(
_In_opt_ PCSTR pNodeName,
_In_opt_ PCSTR pServiceName,
_In_opt_ const ADDRINFOA *pHints,
_Out_ PADDRINFOA *ppResult
);
pNodeName : url에서 추출한 host
pServiceName : http, https, fdp 등등
pHints : 기본설정을 한 뒤 요청하기 위해 사용합니다.
ppResult : pHints로 요청한 결과 값을 얻습니다.
반환 값은 0이 아니면 오류입니다.
다음 소스는 윈도우 기준입니다.
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream> // std::string
#pragma comment (lib, "Ws2_32.lib")
int main(void)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
ADDRINFO stHints;
ADDRINFO *pstResult = nullptr;
U32 u32Result = 0;
SOCKADDR_IN *pstInAddr = nullptr;
S8 s8Addr[INET_ADDRSTRLEN];
U16 u16Port = 0;
ZeroMemory(&stHints, sizeof(stHints));
stHints.ai_family = AF_UNSPEC;
stHints.ai_socktype = SOCK_STREAM;
stHints.ai_protocol = IPPROTO_TCP;
u32Result = getaddrinfo("msdn.microsoft.com", "https", &stHints, &pstResult);
if (u32Result) {
pstInAddr = (LPSOCKADDR_IN)pstResult->ai_addr;
inet_ntop(AF_INET, &pstInAddr->sin_addr, s8Addr, sizeof(s8Addr));
u16Port = ntohs(pstInAddr->sin_port);
printf("ip addr = %s\nport = %d\n", s8Addr, u16Port);
} else {
printf("Error\n");
}
freeaddrinfo(pstResult); // getaddrinfo에서 동적할당하기 때문에 해제
return 0;
}
결과 !
'Network' 카테고리의 다른 글
주소정보 초기화 (0) | 2017.03.26 |
---|---|
WSAData (0) | 2017.03.26 |
sockaddr_in, in_addr (0) | 2017.03.26 |
socket (0) | 2017.03.26 |
send / recv (0) | 2017.03.26 |
댓글