WSAAsyncGetHostByAddr(HwndMain,GETHOSTNAME,"192.168.200.200",
4,PF_INET,receivehostnamebuf,MAXGETHOSTSTRUCT);得到:lParam:0x2afc0000
而用gethostbyaddr可以得到正确的主机名啊

解决方案 »

  1.   

    6 个同步资料库函式,也提供了相对的6 个非同步资料库函式,它们分别是 WSAAsyncGetHostByName()、WSAAsyncGetHostByAddr()、WSAAsyncGetServByName()、WSAAsyncGetServByPort()、WSAAsyncGetProtoByName()、WSAAsyncGetProtoByNumber()。由於它们取得的资料与同步资料库函式相同,所以笔者仅以WSAAsyncGetHostByName() 为例,说明这些非同步函式,并告诉各位读者,同步和非同步资料库函式不同的地方。由字面来看,「非同步」的意思就是我们发出问题时,并不会马上得到答覆,而等到系统取到资料时再告知我们。没错,这些非同步资料库函式的作用就是这样。和 WSAAsyncSelect() 函式一样,我们要告诉 Winsock 系统一个接受通知讯息的视窗及讯息代码,以便系统通知我们。我们呼叫同步资料库函式时,return 值是一个指到相对资料的暂存区,而这个资料暂存区是由系统所提供的;但是呼叫非同步资料库函式时,我们必须自己准备资料暂存区,并将此暂存区的位址当成参数,传给系统,以便系统用来储存取到的资料。读者们必须特别注意一点:在系统通知资料取得成功或失败前,千万不可将传给系统的资料暂存区删除释放,不然当系统取得资料要写入时,资料区已不见了,会导至当机的。除此之外,资料暂存区的大小一定要够大,才足够让系统用来存放取得的资料。(Winsock 规格中的建议值是MAXGETHOSTSTRUCT 1024 bytes 大小的暂存区,笔者认为太大了,100 byets差不多就太够了?呼叫非同步资料库函式时,得到的 return 值是一个代码,此代码代表的就是此项呼叫在系统内的编号;由於是非同步,所以我们在得到答案前,仍可呼叫 WSACancelAsyncRequest() 函式来取消原先的呼叫,这个取消的动作就要利用到该代码了。另外,当我们收到结果通知时,wParam 的值也是这个代码;我们此时可以利用 WSAGETASYNCERROR(lParam) 来得知资料取得是成功或失败;如果失败的原因是原先传入的暂存区太小的话,我们亦可利用WSAASYNCGETBUFLEN(lParam) 来得知至少要多大的暂存区才够。◎ WSAAsyncGetHostByName():利用某一 host 的名称来获取该 host 的资料。(非同步方式)格 式: HANDLE PASCAL FAR WSAAsyncGetHostByName( HWND hWnd,unsigned int wMsg, const char FAR *name, char FAR *buf, intbuflen );参 数: hWnd 动作完成後,接受讯息的视窗 handlewMsg 传回视窗的讯息name host 名称buf 存放 hostent 资料的暂存区buflen buf 的大小传回值: 成功 - 代表此非同步动作的 handle 代码失败 - 0 (呼叫 WSAGetLastError() 可得知原因)说明: 此函式是利用 host 名称来获取其他的资料,如 host 的位址、别名,位址的型态、长度等。使用者呼叫此函式时必须传入要接收资料的视窗 handle、讯息代码、资料的存放位址指标等,以便得到资料时可以通知该视窗来使用资料。呼叫此函式後会马上回到使用者的呼叫点并传回一个 handle 代码,此代码可用来辨别此非同步动作或用来取消此非同步动作。当资料取得後,系统会送一个讯息到使用者指定的视窗。◎ WSACancelAsyncRequest():取消某一未完成的非同步要求。格 式: int PASCAL FAR WSACancelAsyncRequest( HANDLEhAsyncTaskHandle );参 数:hAsyncTaskHandle 要取消的 task handle 代码传回值: 成功 - 0失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)说明: 此函式是用来取消原先呼叫但尚未完成的WSAAsyncGetXByY(),例如 WSAAsyncGetHostByName(),的动作。参数 hAsyncTaskHandle 即为呼叫WSAAsyncGetXByY() 时传回之代码值。若是原先呼叫之非同步要求已经完成,则无法加以取消。
      

  2.   

    OnInitDialog()
    {
    CDialog::OnInitDialog()
    ......
    WSADATA wsaD;
    WORD m_wVersion;
    m_wVersion = MAKEWORD(2,0);
    WSAStartup( m_wVersion, &wsaD );
    ..................
    WSAAsyncGetHostByAddr(HwndMain,GETHOSTNAME,"192.168.200.180",4,PF_INET,receivehostnamebuf,MAXGETHOSTSTRUCT);
    .....
    }....
    LRESULT CArpattackDlg::GetHostNameByMessage(WPARAM wParam,LPARAM lParam) 
    {  return 0L;//获得异步返回的消息后 lParam:0x2afc0000始终未能得到主机名}
    这么简单,可就是不行,请大家帮我调试一下啊
      

  3.   

    经查,2afc错误:Valid name, no data record of requested type
    -------正确名称,没有被请求的类型数据记录----
    what`s meaning?
      

  4.   

    我知道了,这里错"192.168.200.180",应该是网络字节
    但同时又有一个问题:
    http://expert.csdn.net/Expert/topic/1621/1621466.xml?temp=.3997461