在进行套接字编程时,查找域名然后连接到域名的正确方法是什么?

时间:2011-08-31 20:04:02

标签: c++ sockets winsock gethostbyname

我编写了网络应用程序,但主要是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的那个时髦的演员看起来对于我实际上做的事情来说太复杂了,这使我相信这不是“应该完成”的方式。我是不是习惯了高级语言,这是应该的方式,还是我错过了某个实用功能呢?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

从技术上讲,您应该使用h_addrtype而不是假设AF_INET,然后根据该类型解释h_addr_list。一旦您假设AF_INETsocketconnect中),您可以假设h_addr_list[0]正如您所做的那样in_addr。您可以检查h_addrtype,以防您获得AAAA记录(IPv6),这样您就可以拒绝而不是误导它。

答案 1 :(得分:1)

我认为解决域名的最新推荐方法是使用getaddrinfowindowslinux)。

据我所知,没有标准的异步查找方式,因此产生专门用于DNS查找的线程是很常见的。