奇怪!!!
if(m_ClientSocket.Connect("192.168.0.18", m_nPort))
{
   AfxMessageBox("m_ClientSocket.Connect OK!");
}
else
{
   int nErrCode = m_ClientSocket.GetLastError();
   CString sErrMsg;
   sErrMsg.Format("连接失败!错误号=%d 。", nErrCode);
   AfxMessageBox(sErrMsg);
}以上代码一直说:连接失败!错误号=0;
可实际上已经连接,而且运行正常。是不是MFC的BUG?我的地址是本机地址,用IPCONFIG /ALL看的,端口为2000。还有那个地址是否可以用机器名称,如"Server"代替?

解决方案 »

  1.   

    Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError.
      

  2.   

    以下是把错误代码转化为可视文档的方法:
    if(m_ClientSocket.Connect("192.168.0.18", m_nPort))
    {
       AfxMessageBox("m_ClientSocket.Connect OK!");
    }
    else
    {
       int nErrCode = m_ClientSocket.GetLastError();
       TCHAR errMsg[2048] = {0};
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
       GetModuleHandle(TEXT("ws2_32.dll")), i,
    NULL,
    errMsg,
    sizeof(errMsg)/sizeof(TCHAR),
    NULL);
       AddErr(_T(errMsg));//显示错误信息
    );
    }
      

  3.   

    楼上的,我的消息显示:操作成功完成!现在我怀疑,由于m_ClientSocket从CAsyncSocket派生,而CAsyncSocket是异步的。好像有一种说法,对异步的SOCKET,不能即时完成的操作均返回FALSE。但难以理解的是,按照这种说法,应该得到错误是:WSAEWOULDBLOCK。????
      

  4.   

    通常情况下第一次连接失败会提示错误信息如:由于目标机器积极拒绝.....,
    起后在连则提示以上信息.m_ClientSocket.Connect("192.168.0.18", m_nPort)
    为FALSE时连接肯定是失败的.
      

  5.   

    因为你用的是非阻塞方式 socket,所以你的连接一般情况下不会立刻响应,你不该这样写代码:
       给你个解决办法,在m_ClientSocket的类的OnConnect()事件中处理你连接问题:在OnConnect事件中,你可以知道连接是成功还是失败,然后在处理。
      

  6.   

    还有你可以用CSocket类,这个类用是阻塞方式,这样就不存在你的问题了
      

  7.   

    按照msdn的文档查查看:WSAEWOULDBLOCK的值是多少?
    因为是异步操作,所以有必要的延时。
    用模型吧,自己来判断岂不是有点多此一举?
      

  8.   

    WSAEWOULDBLOCK好像等于10035,其实我原来是没有检查返回值的,为了使代码更规范,才加了它,没想到竟发现这个问题,而MSDN及有关文献均没有查到这个解释。大多如zhouyong0371(小周周) 所Copy的那一段所说。
      

  9.   

    OnConnect(int nErrCode)事件中,有返回代码,你在连接的时候不用判别返回代码的
      

  10.   

    同意楼上意见,将以下代码放如OnConnect(int nErrCode)中就可得到正确的错误信息:
    if(nErrCode==SOCKET_ERROR )
    {
       TCHAR errMsg[2048] = {0};
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
       GetModuleHandle(TEXT("ws2_32.dll")), i,
    NULL,
    nErrCode,
    sizeof(errMsg)/sizeof(TCHAR),
    NULL);
       AddErr(_T(errMsg));//显示错误信息
    }
      

  11.   

    xmndragon(龙--x) :你的FormatMessage好像部正确啊,正确的应该如下: TCHAR errMsg[2048] = {0};
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,//GetModuleHandle(TEXT("ws2_32.dll")), 
    nErrorCode,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    errMsg,
    sizeof(errMsg)/sizeof(TCHAR),
    NULL);
    AfxMessageBox((LPCTSTR)lpMsgBuf);//显示错误信息