我要和服务器连接,当发现连接断开的时候,我打开定时器,重新建立连接。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() 这里就停住不不动了,再也连不上。关闭程序,也会弹出错误对话框。请高手解决,谢谢。
{
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() 这里就停住不不动了,再也连不上。关闭程序,也会弹出错误对话框。请高手解决,谢谢。
你的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()).....
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);
}