gethostbyname создает поток?

Я работаю в C++ с VS2008 и Win7.

При изучении программы я следил за созданными потоками, и кажется, что gethostbyname() создает поток для себя. Не могли бы вы объяснить, почему?

На msdn написано: "Память для структуры hostent, возвращаемой функцией gethostbyname, внутренне выделяется Winsock DLL из локального хранилища потока".

Эта память обманывает визуальную студию, заставляя ее думать, что это нить?

РЕДАКТИРОВАТЬ: Кажется, что из этой ссылки, а также из моих наблюдений, что это также происходит с функцией подключения. Я думаю, это нормальное поведение.

Код ниже взят из msdn [gethostbyname page] и демонстрирует то же поведение.

int main(int argc, char **argv)    
{    
    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    DWORD dwError;
    int i = 0;

    struct hostent *remoteHost;
    char *host_name;
    struct in_addr addr;

    char **pAlias;

    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s hostname\n", argv[0]);
        printf("  to return the IP addresses for the host\n");
        printf("       %s www.contoso.com\n", argv[0]);
        printf(" or\n");
        printf("       %s IPv4string\n", argv[0]);
        printf("  to return an IPv4 binary address for an IPv4string\n");
        printf("       %s 127.0.0.1\n", argv[0]);
        return 1;
    }
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    host_name = argv[1];

    printf("Calling gethostbyname with %s\n", host_name);
    remoteHost = gethostbyname(host_name);

    if (remoteHost == NULL) {
        dwError = WSAGetLastError();
        if (dwError != 0) {
            if (dwError == WSAHOST_NOT_FOUND) {
                printf("Host not found\n");
                return 1;
            } else if (dwError == WSANO_DATA) {
                printf("No data record found\n");
                return 1;
            } else {
                printf("Function failed with error: %ld\n", dwError);
                return 1;
            }
        }
    } else {
        printf("Function returned:\n");
        printf("\tOfficial name: %s\n", remoteHost->h_name);
        for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
            printf("\tAlternate name #%d: %s\n", ++i, *pAlias);
        }
        printf("\tAddress type: ");
        switch (remoteHost->h_addrtype) {
            case AF_INET:
                printf("AF_INET\n");
            break;
            case AF_NETBIOS:
                printf("AF_NETBIOS\n");
            break;
            default:
                printf(" %d\n", remoteHost->h_addrtype);
            break;
        }
        printf("\tAddress length: %d\n", remoteHost->h_length);

        i = 0;
        if (remoteHost->h_addrtype == AF_INET)
        {
            while (remoteHost->h_addr_list[i] != 0) {
                addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
                printf("\tIP Address #%d: %s\n", i, inet_ntoa(addr));
            }
        }
        else if (remoteHost->h_addrtype == AF_NETBIOS)
        {   
            printf("NETBIOS address was returned\n");
        }   
    }
    return 0;
}

2 ответа

Решение

AFAIK, gethostbyname блокирует.

WinSock часто создает некоторые вспомогательные потоки.

Нет, локальное хранилище потока не связано с запуском нового потока.

Поток может быть необходим из-за проблем сходства потоков с подоперациями API GetHostByName, таких как необходимость использовать асинхронные обратные вызовы без влияния на повторный вход вызывающего потока.

Или это может быть ленивая функция инициализации WinSock, где необходим поток демона, необходимый для подмножества операций WinSock, и это был первый API, который потребовал демона.

Другие вопросы по тегам