Frage

Ich arbeite in C ++ mit VS2008 und Win7.

Bei der Untersuchung eines Programms folgte ich den erstellten Threads, und es scheint, dass GetHostByName () einen Thread für sich selbst erstellt. Könnten Sie erklären, warum?

Auf MSDN heißt es: "Der Speicher für die hostente Struktur, die von der GetHostByName -Funktion zurückgegeben wird, wird intern von der Winsock DLL aus lokalem Thread -Speicher zugeordnet."

Bringt dieses Memory Narr Visual Studio in der Meinung, es sei ein Thread?

Bearbeiten: Es scheint das von dieser Link, und auch aus meinen Beobachtungen, dass dies auch mit der Verbindungsfunktion geschieht. Ich denke, das ist ein normales Verhalten.

Der folgende Code stammt von MSDN [GetHostByName -Seite] und zeigt dasselbe Verhalten.

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;
}
War es hilfreich?

Lösung

Afaik, Gethostbyname -Blöcke.

Winsock schafft jedoch oft einige Helferfäden.

Andere Tipps

Nein, der Thread-lokale Speicher hat nichts mit dem Start eines neuen Threads zu tun.

Der Thread kann aufgrund von Problemen von Thread-Affinität mit Unteroperationen der GetHostbyName-API erforderlich sein, z.

Oder es kann sich um eine faule Initialisierungsfunktion von Winsock handeln, bei der ein Daemon -Thread für eine Untergruppe von Winsock -Operationen benötigt wird, und dies war die erste API, die den Daemon benötigte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top