2011-08-31 39 views
3

我編寫了網絡應用程序,但主要是用Python編寫的。在進行套接字編程時,查找域名然後連接到域名的正確方法是什麼?

我正在編寫一個C++應用程序,我對語法應該是查找域名並連接到它的IP地址有點模糊。

具體而言,我不知道如何去形成gethostbyname()調用到套接字的結果。

我的代碼目前看起來是這樣的:

const hostent* host = GetHost(); //This works correctly 
    if (!host) { 
     DebugMessage("Bad host", "Could not resolve host"); 
     return NULL; 
    } 
    DebugMessage("Got host", host->h_name); 

    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    //This funky cast is what i'm concerned about 
    addr.sin_addr.s_addr = (*((in_addr*)(host->h_addr_list[0]))).s_addr; 
    addr.sin_port = htons(80); 

    DebugMessage("addr", (*((in_addr*)(host->h_addr_list[0]))).s_addr); 

    int c = connect(s, (SOCKADDR*)&addr, sizeof(addr)); 
    int le = WSAGetLastError(); 
    if (c == SOCKET_ERROR) { 
     //etc... 

它的工作,但在我看來,那時髦投了分配s_addr似乎是什麼,我實際上做的太複雜了,導致我beleive這不是它「應該完成」的方式。我是否習慣了高級語言,這就是它應該的方式,還是我在某處遺漏了一個實用函數?

感謝您的幫助。

回答

1

從技術上講,您應該使用h_addrtype而不是假設AF_INET,然後根據該類型解釋h_addr_list。一旦你已經假設AF_INET(都在socketconnect),你可能會認爲h_addr_list[0]in_addr像你這樣做。如果您獲得AAAA記錄(IPv6),您可以檢查h_addrtype,以便您可以拒絕它,而不是誤傳它。

+0

因此,如果我假設'h_addrtype'肯定是'AF_INET',我發佈的代碼基本上是正確的?那就是,我應該如何繼續這樣做?謝謝您的幫助。 –

1

我相信最新和推薦的解決域名的方法是使用getaddrinfowindowslinux)。

據我所知,沒有標準的異步查找方式,因此生成一個專門用於DNS查詢的線程是很常見的。

+0

我通常最喜歡的是使用'libasyncns',它創建一個sidecar線程或進程,通過管道或socketpair與主循環進行通信。將這個文件句柄添加到select/poll/etc ..循環並以非阻塞方式處理它很容易。 http://0pointer.de/lennart/projects/libasyncns/ – LeoNerd