4

我已经编写了网络应用程序,但主要是在 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 的时髦演员对于我实际正在做的事情来说似乎太复杂了,这让我相信这不是它“应该做的”方式。我是不是太习惯高级语言了,这就是它应该的方式,还是我在某个地方缺少实用功能?

谢谢您的帮助。

4

2 回答 2

1

从技术上讲,您应该使用h_addrtype而不是假设AF_INET然后h_addr_list根据该类型进行解释。一旦你已经假设AF_INET(在socket和中connect)你也可以假设这h_addr_list[0]in_addr你正在做的。您可以检查h_addrtype是否有 AAAA 记录 (IPv6),这样您就可以拒绝它而不是误投它。

于 2011-08-31T20:08:15.407 回答
1

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

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

于 2011-08-31T20:27:00.000 回答