2013-03-28 27 views
3

我試着做一個簡單的程序,它在一個字符串像www.google.com,並返回的IP地址...如何使用getaddrinfo()?

我有什麼至今:

char* hostname = new char[www.size()+1]; 
std::copy(www.begin(), www.end(), hostname); 
hostname[www.size()] = '\0'; 

struct addrinfo new_addr, *res; 

getaddrinfo(www.c_str(), SERVICE.c_str(), &new_addr, &res); 



cout << new_addr.ai_addr; 

什麼是第三應該做的第四個參數? getaddrinfo函數是否修改new_addr結構或什麼?我真的不明白msdn文檔。主機名解析後,我想連接到它的套接字。

回答

0

MSDN文檔非常詳細,並準確解釋了各種參數的用途。第三個參數可讓您指定將與查找結果一起使用的套接字類型。這將結果根據需要進行優化。第四個參數返回實際結果。該文檔還包含如何使用該功能的完整示例。那麼什麼樣的文件說什麼不清楚?

試試這個:

struct addrinfo hints = {0}; 
hints.ai_flags = 0; 
hints.ai_family = AF_UNSPEC; // IPv4 and IPv6 allowed 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_protocol = IPPROTO_TCP; 

struct addrinfo *res = NULL; 

if (getaddrinfo(www.c_str(), SERVICE.c_str(), &hints, &res) == 0) 
{ 
    TCHAR szIPAddr[64]; 
    DWORD szIPAddrLen; 
    SOCKET skt; 

    struct addrinfo *addr = res; 
    do 
    { 
     skt = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); 
     if (skt == INVALID_SOCKET) 
      cout << "Unable to create socket, error " << WSAGetLastError() << endl; 
     else 
     { 
      szIPAddrLen = 64; 
      WSAAddressToString(addr->ai_addr, addr->ai_addrlen, NULL, szIPAddr, &szIPAddrLen); 

      cout << "Connecting to " << szIPAddr << " ..." << endl; 

      if (connect(skt, addr->ai_addr, addr->ai_addrlen) == 0) 
      { 
       cout << "Connected!" << endl; 
       break; 
      } 

      cout << "Unable to connect, error " << WSAGetLastError() << endl; 
      closesocket(skt); 
      skt = INVALID_SOCKET; 
     } 

     addr = addr->ai_next; 
    } 
    while (addr); 

    freeaddrinfo(res); 

    if (skt != INVALID_SOCKET) 
    { 
     // use skt as needed... 
     closesocket(skt); 
    } 
} 
+0

hints.ai_flags = 0; hints.ai_family = AF_UNSPEC; //允許IPv4和IPv6 hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; 所以提示結構是getaddrinfo函數的指導工具嗎? – Kelvin

+0

@Kelvin:你的觀點是......? –

+0

提示的東西是讓我困惑的東西。它應該作爲getaddr函數的指導工具,但實際上,它不會被修改嗎? – Kelvin

1

如果我離開的第三個參數無效?

繼承人迄今爲止我開發的代碼。

char* hostname = new char[www.size()+1]; 
copy(www.begin(), www.end(), hostname); 
hostname[www.size()] = '\0'; 

struct addrinfo *res; 
struct in_addr addr; 

getaddrinfo(hostname, NULL, 0, &res); 

addr.S_un = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.S_un; 

server.sin_addr.s_addr = inet_addr(inet_ntoa(addr)); 
server.sin_port = htons(portno); 

freeaddrinfo(res); 
delete []hostname; 

server.sin被聲明在其他地方,我用它來填充套接字的另一種方法,我的套接字類。