【问题标题】:gethostbyname creates a thread?gethostbyname 创建一个线程?
【发布时间】:2011-02-27 22:22:23
【问题描述】:

我正在使用 VS2008 和 Win7 使用 C++。

在检查程序时,我正在跟踪创建的线程,似乎 gethostbyname() 为自己创建了一个线程。你能解释一下为什么吗?

在 msdn 上说: "由 gethostbyname 函数返回的 hostent 结构的内存由 Winsock DLL 从线程本地存储内部分配。"

这个内存是否会让 Visual Studio 误以为它是一个线程?

编辑:从this link 看来,从我的观察来看,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;
}

【问题讨论】:

  • FWIW,如果您认为 VS 对什么是线程感到困惑,您可以使用 SysInternals 的 ProcessMonitor 来获得明确的答案。

标签: c++ gethostbyname


【解决方案1】:

AFAIK,gethostbyname 块。

不过,WinSock 经常会创建一些帮助线程。

【讨论】:

    【解决方案2】:

    不,线程本地存储与新线程的启动无关。

    由于 GetHostByName API 的子操作的线程关联性问题,可能需要该线程,例如需要使用异步回调而不影响调用线程的重入。

    或者它可能是 WinSock 的一个惰性初始化功能,其中需要一个守护线程来执行 WinSock 操作的子集,这是第一个需要守护进程的 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多