Вопрос

Я работаю в 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;
}
Это было полезно?

Решение

Afaik, GethostbyName блоки.

Winsock часто создает несколько вспомогательных нитей, хотя.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top