Pregunta

Estoy trabajando en C ++ con VS2008 y Win7.

Mientras examinaba un programa, estaba siguiendo los hilos creados, y parece que GethostByName () crea un hilo para sí mismo. ¿Podrías explicar por qué?

En MSDN dice: "La memoria para la estructura hostente devuelta por la función GethostByName se asigna internamente mediante la DLL Winsock del almacenamiento local de subprocesos".

¿Este recuerdo es tonto Visual Studio para que piense que es un hilo?

Editar: parece que desde este enlace, y también de mis observaciones de que esto también sucede con la función de conexión. Supongo que este es un comportamiento normal.

El siguiente código es de MSDN [GethostByName Page] y exhibe el mismo comportamiento.

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;
}
¿Fue útil?

Solución

AFAIK, GethostByName Blocks.

Sin embargo, Winsock a menudo crea algunos hilos de ayuda.

Otros consejos

No, el almacenamiento local de hilo no está relacionado con el inicio de un nuevo hilo.

Es posible que el hilo sea necesario debido a problemas de afinidad de hilo con suboperaciones de la API GethostByName, como la necesidad de usar devoluciones de llamada asincrónicas sin afectar el reingreso del hilo de llamada.

O puede ser una característica de inicialización perezosa de Winsock donde se necesita un hilo de demonio necesario para un subconjunto de operaciones de Winsock, y esta fue la primera API en requerir el demonio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top