我要和服务器连接,当发现连接断开的时候,我打开定时器,重新建立连接。CSimSocket* g_SocketApp = NULL;void CSimSocket::OnClose(int nErrorCode) 
{
    CAsyncSocket::OnClose(nErrorCode);
    bConnected = false;
    g_SocketTimer = SetTimer(NULL, 2, 3000, OnTimer);
    CloseSocket();
}void CloseSocket()
{
    if (g_SocketApp != NULL)
    {
g_SocketApp->Close();
delete g_SocketApp;
g_SocketApp = NULL;
    }
}void CALLBACK OnTimer(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
    KillTimer(NULL, g_SocketTimer);
    while (g_SocketApp == NULL)
    {
        g_SocketApp = new CSimSocket();

        if (g_SocketApp == NULL || g_SocketApp->Create() == 0)
        {
            if (g_SocketApp != NULL)
            {
                delete g_SocketApp;
                g_SocketApp = NULL;
            }            int iRet = ::MessageBox(NULL,
                                    "Check the Host Connect Please!", 
                                    "Create Socket Failure", 
                                    MB_ABORTRETRYIGNORE|MB_ICONERROR|MB_SYSTEMMODAL );
            if (iRet == IDIGNORE)
            {
                return -1;
            }
            if (iRet == IDABORT)
            {
                return -1;
            }
        }
    }
    if (g_SocketApp != NULL)
    {
        g_SocketApp->Connect();
    }
   return 0;
}现在的问题是,第一次和服务器连接成功后,我把服务器关掉。然后再打开服务器监听,程序运行到 g_SocketApp->Create() 这里就停住不不动了,再也连不上。关闭程序,也会弹出错误对话框。请高手解决,谢谢。

解决方案 »

  1.   

    看得代码感觉很混乱。
    你的socket能触发onclose,就是服务器端断开了,你不用在调用soket.close了。直接在onclose里把这个socket delete掉或者重新链接。
    而且你为什么要用个while循环呢。new出来要么成功,要么不成功。
    直接这样不行么:
    CMysocket* pSocket = new CMySocket();
    if(pSocket == NULL)
      return false;if(!pSocket.Create())
      return false;if(pSocket.Connect()).....
      

  2.   

    http://blog.csdn.net/wang921718/archive/2007/09/04/1772396.aspx看看这里我的BLOG,希望对你能有帮助!
      

  3.   

    我根据你写的,自己做了个测试程序。第一次连上了,当服务器关闭后,把定时器打开,然后再打开服务器,WSAGetLastError()一直等于WSAENOTSOCK。始终连上不上。到底是怎么回事啊。
    void CTestDlg::OnTimer(UINT nIDEvent) 
    {
    if (nIDEvent == 2)
    {
     sockaddr_in sa;
     sa.sin_family = AF_INET;
     sa.sin_port = htons(atoi("5555")); 
     sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    int  iRetErr=connect(m_gCnSocket,(SOCKADDR *)&sa,sizeof(sa));
    int i = WSAGetLastError();
    }

    CDialog::OnTimer(nIDEvent);
    }