int connect(SOCKET   s,   const   struct   sockaddr   *name,   int   namelen);在上面的函数中,对sockaddr   *name参数能否用相应ip对应的hostname呢?
在C:\WINDOWS\system32\drivers\etc\hosts文件中添加项如:
192.168.10.28 ServerIp在connect函数中的name参数能否用"ServerIp"这个字段呢,我用"ServerIp"字段connect时返回-1,失败不知各位大侠有什么方法在这个函数中用hostname而不是具体ip?谢谢。
如若可能同样能不能用相应的DNS而不是具体的ip呢?注:查看MSDN时看到CAsyncSocket::Connect函数可以用相应的名字,不知这里面是如何实现的?
BOOL Connect(
   LPCTSTR lpszHostAddress,
   UINT nHostPort 
);
BOOL Connect(
   const SOCKADDR* lpSockAddr,
   int nSockAddrLen 
);

解决方案 »

  1.   

    看CAsyncSocket::Connect函数的实现代码
    用机器名的话里面会进行一次转换的
    转换用gethostbynameBOOL CAsyncSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
    {
    USES_CONVERSION_EX; ASSERT(lpszHostAddress != NULL); if (lpszHostAddress == NULL)
    {
    return FALSE;
    } SOCKADDR_IN sockAddr;
    memset(&sockAddr,0,sizeof(sockAddr)); LPSTR lpszAscii = T2A_EX((LPTSTR)lpszHostAddress, _ATL_SAFE_ALLOCA_DEF_THRESHOLD);
    if (lpszAscii == NULL)
    {
    WSASetLastError(ERROR_NOT_ENOUGH_MEMORY);
    return FALSE;
    } sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = inet_addr(lpszAscii); if (sockAddr.sin_addr.s_addr == INADDR_NONE)
    {
    LPHOSTENT lphost;
    lphost = gethostbyname(lpszAscii);
    if (lphost != NULL)
    sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
    else
    {
    WSASetLastError(WSAEINVAL);
    return FALSE;
    }
    } sockAddr.sin_port = htons((u_short)nHostPort); return Connect((SOCKADDR*)&sockAddr, sizeof(sockAddr));
    }
      

  2.   

    楼上正解  用gethostbyname
      

  3.   

    好了,能得到IP了,
    如果用DNS的话,是不是要先设定DNS服务器才行啊?
    对DNS不是很懂,本机能设定指向两个或三个不同地方DNS吗?谢谢
      

  4.   

    hostent* localHost;
    char* localIP; // Get the local host information
    localHost = gethostbyname("www.microsoft.com");
    localIP = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list);这样确实能取到对应的IP了,不管你gethostbyname的参数是hostname或者DNS或者具体的ip,转换后都能取到对应的ip注:localHost和localIP都是指针,不知道是不是函数在给你传递值的同时也给你分配了内存,不知要不要自己delete掉对应的内存localHost和localIP?看过很多代码,都没有对此处的内存进行处理,什么机制没有内存泄露呢?
      

  5.   

    在程序结束前调用
    delete localHost;
    delete localIP;
    这两句中的任何一句处都会中断,说明此处的内存不用自己处理。(只是不知道系统什么时候怎么Release这两块内存的?)