就是要用ATTACH和DETACH的原因。因为线程传递CASYNCSOCKET不安全。传递SOCKET 就可以了。以前我也有类似的错误。是一个牛B人告诉我的。 SOCKET *S;
S=new SOCKET;
*S=xxx.DETACH();
::AfxBeginThread(...,(LPVOID)S);
///....
线程里
XXX XX;
XX。ATTACH(*S);
DELETE S;
解决方案 »
- 如何用vc++ 开发ocx扩展名的dll
- 用FindWindow找到一个窗口后,应该怎么结束它?
- 请问程序该如何调试?
- 谁给解释一下要在win CE里运行的程序有什么要求吗?
- 如何在ListCtrl得到点的Column的文字啊?
- 有没有曲线拟合的例子
- IE与ActiveX交互的问题
- ado的Connection对象的Execte方法会对Recordset对象有什么影响??
- 请问能否实现一个程序对另一个程序的运行的监测,比如计算某个可执行文件一天之内执启动多少次
- 100分请教一个关于VC继承的基础问题
- 控制台应用程序里不能显示 Unicode 汉字吗?(高手请赐教)
- 请问,如何在一个COM组件中显示一个或多个对话框?
不如把代码贴出来说不定能骗点分。
其实用MFC你根本不用CLOSE。类早帮你高定了
void CSERVERView::ONACCEPT()
{
//::AfxMessageBox("ASDFAS");
CAsyncSocket client;
CSERVERApp * app=(CSERVERApp *)::AfxGetApp();
app->listen.Accept(client);
SOCKET *S=new SOCKET;
*S=client.Detach();
::AfxBeginThread(NewClient,(LPVOID)S);
app->listen.AsyncSelect(FD_ACCEPT);
}
UINT NewClient(LPVOID P)
{
CSERVERApp * app=(CSERVERApp *)::AfxGetApp();
SOCKET *S=(SOCKET*)P;
CAsyncSocket client;
client.Attach(*S);
delete S;
//。/* MM你好吗?
好啊。咱们结束通行吧
*/
}
线程里用:
进入临界区;
发送数据;
退出临界区;OnClose函数:
进入临界区
关闭socket
退出临界区