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

When doing socket programming, what is the correct way to look up a domain name and then connect to it?

本文关键字:是什么 方法 连接 然后 套接字 编程 域名 查找      更新时间:2023-10-16

我编写过网络应用程序,但主要是用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的那种时髦的cast对于我实际做的事情来说似乎太复杂了,导致我相信这不是"应该做"的方式。我只是太习惯高级语言了,这是它应该的方式,还是我错过了一个实用功能?

谢谢你的帮助

从技术上讲,您应该使用h_addrtype而不是假设AF_INET,然后根据该类型解释h_addr_list。一旦你已经假设了AF_INET(在socketconnect中),你也可以假设h_addr_list[0]是一个in_addr。你可以检查h_addrtype,以防你得到一个AAAA记录(IPv6),这样你就可以拒绝它,而不是错误地转换它。

我相信最新和推荐的域名解析方法是使用getaddrinfo (windows, linux)。

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