본문 바로가기
프로그래밍/Network

getaddrinfo

by 사탕공방 2017. 3. 26.

이 포스트는 네이버 블로그에 올렸던 포스트를 가져온 것입니다.




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

댓글