gethostbyname создает поток? - PullRequest
       5

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

3 голосов
/ 04 июня 2010

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

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

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

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

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

Приведенный ниже код взят из 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 ]

3 голосов
/ 04 июня 2010

AFAIK, блоки gethostbyname.

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

1 голос
/ 04 июня 2010

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

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

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

...