При программировании сокетов, как правильно найти доменное имя и затем подключиться к нему? - PullRequest
3 голосов
/ 01 сентября 2011

Я запрограммировал сетевые приложения, но в основном на 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 ]

1 голос
/ 01 сентября 2011

Я полагаю, что последний и рекомендуемый способ разрешения доменного имени - это использование getaddrinfo ( windows , linux ).

Насколько я знаю,стандартного способа асинхронного поиска не существует, поэтому довольно часто создается поток, предназначенный для поиска DNS.

1 голос
/ 01 сентября 2011

Технически вы должны использовать h_addrtype вместо предположения AF_INET, а затем интерпретировать h_addr_list на основе этого типа. Как только вы уже принимаете AF_INET (как в socket, так и в connect), вы можете также предположить, что h_addr_list[0] - это in_addr, как и вы. Вы можете проверить h_addrtype в случае, если вы получили запись AAAA (IPv6), так что вы можете отклонить ее, а не ошибиться.

...