关于MFC创建是用CSocket创建客户端的有关问题
关于MFC创建是用CSocket创建客户端的问题?
基于对话框创建的MFC程序
有"连接"和"断开"两个按钮
下面的代码是"连接"按钮对应处理函数创建的子线程,
问题:
1.连上是没有问题,但是如果服务器重启或者故障后,再点"连接"按钮就没有反应,问题出在connect()这个函数上,不知道怎么解决。我想实现的功能是即使连接中断后,再点一次"连接"按钮,就可以连上服务器;
2."断开"按钮的程序应该怎么写,我一调用Close(),就会弹出错误。
------解决方案--------------------
我以前做法是用的指针,new一个出来,中断后直接delete,再连接再new。至于close之前要加判断
------解决方案--------------------
楼主用的是MFC中的CSocket类是吧!我之前使用的都是api,不过我想用法都是大同小义。给楼主提供我的做法:用api建立好socket后我一般都用启动一个线程在线程函数中调用recv方法,这个方法是接受远端发送数据的方法,如果远端发送数据recv的返回值是数据的size,如果远端断开了,会返回“-1”。这个是很关键,所以当我判断recv有“-1”返回时我就认为socket已经失效了。这时应该断开socket,就是释放socket。释放之前再重新连接没有问题,除了远端没有回应的情况。
楼主可以在CSocket类中找到类拟recv这样的方法,用于判断socket无效,之后再调用CSocket的释放方法如“close”就应该可以了。或者就是用new或delete。
基于对话框创建的MFC程序
有"连接"和"断开"两个按钮
下面的代码是"连接"按钮对应处理函数创建的子线程,
UINT ConnectThreadFunc(LPVOID lpParam)
{
threadInfo_Connect* pInfo=(threadInfo_Connect*)lpParam;
AfxSocketInit();
if(!g_TCPCreated)
{
if(!PLC_1.Create())
{
AfxMessageBox(L"创建失败!");
return 0;
}
g_TCPCreated = TRUE;
}
pInfo->nWndMainDlg->SetTimer(Timer1, 2000, 0);
if(PLC_1.Connect(L"192.168.2.111", 1234))
{
g_TCPConnected = TRUE;
pInfo->nWndMainDlg->PostMessageW(USER_CONNECT_OK, NULL, NULL);
}
else
{
pInfo->nWndMainDlg->PostMessageW(USER_CONNECT_FAIL, NULL, NULL);
}
return 0;
}
问题:
1.连上是没有问题,但是如果服务器重启或者故障后,再点"连接"按钮就没有反应,问题出在connect()这个函数上,不知道怎么解决。我想实现的功能是即使连接中断后,再点一次"连接"按钮,就可以连上服务器;
2."断开"按钮的程序应该怎么写,我一调用Close(),就会弹出错误。
------解决方案--------------------
我以前做法是用的指针,new一个出来,中断后直接delete,再连接再new。至于close之前要加判断
------解决方案--------------------
楼主用的是MFC中的CSocket类是吧!我之前使用的都是api,不过我想用法都是大同小义。给楼主提供我的做法:用api建立好socket后我一般都用启动一个线程在线程函数中调用recv方法,这个方法是接受远端发送数据的方法,如果远端发送数据recv的返回值是数据的size,如果远端断开了,会返回“-1”。这个是很关键,所以当我判断recv有“-1”返回时我就认为socket已经失效了。这时应该断开socket,就是释放socket。释放之前再重新连接没有问题,除了远端没有回应的情况。
楼主可以在CSocket类中找到类拟recv这样的方法,用于判断socket无效,之后再调用CSocket的释放方法如“close”就应该可以了。或者就是用new或delete。