CSocket 多线程编程问题

M2M_ROME 2015-11-26 08:57:21
现在正做一个基于对话框的软件,功能是以客户端的形式与服务器通信,对服务器发指令然后接受服务器数据,并将数据实时显示。
接收数据的过程是循环发指令循环接收,显示也是一直在更新。现在的思路就是将接收数据过程和显示数据过程分别在两个工作线程中进行,在主线程中创建CSocket对象并与服务器建立连接,将CSocket对象以参数的形式传递给服务器。
但现在的问题,刚一调用接收数据线程,程序就死掉,问题出在sockcore.cpp中,Line851位置,现在真不知该怎么办了。
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
假正经的班长 2015-11-27
  • 打赏
  • 举报
回复
传说中,CSocket类不是很稳定,具体为何不稳定,倒是没有仔细研究。 看你这个需求,直接用socket就可以了吧,socket 值就是个整数值,线程间传递这个值,是安全的。
oyljerry 2015-11-27
  • 打赏
  • 举报
回复
快线程传递CSocket需要用Detach,Attach等方式
信阳毛尖 2015-11-27
  • 打赏
  • 举报
回复
需要提出一点的是,CSocket在多线程中使用的时候必须要注意使用正确,因为CSocket的创建跟创建线程有关,其他的线程使用的时候如果用法不对,就找不到创建的那个CSocket的‘句柄’ 所以一般不建议在多线程通信中使用CSocket 如果一定要这么做,大致应该是: 1、当前拥有这个CSocket的线程调用Detach方法,使CSocket的句柄和CSocket对象及当前线程脱离关系 2、当前线程把这个Detach返回的SOCKET句柄传递给另外一个线程 3、另外一个线程创建新的CSocket对象,并调用Attach 伪代码:

CSocket socketObj;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
    socketObj.Attach((SOCKET)sock);
    //.....
    //.....
    socketObj.Close ();
    return 0;
}
void CUIxxoo::OnOK() 
{
    socketObj.Create();
    SOCKET hSocket = socketObj.Detach();
 
    DWORD id(0);
    ::CreateThread(NULL,0,ThreadProc,(LPVOID)hSocket,0,&id);
}
哎,你直接用socket裸写就不行吗?
encoderlee 2015-11-26
  • 打赏
  • 举报
回复
由于CSocket对象的实现比较特殊,在一个线程中创建的CSocket对象不要直接传递到另外一个线程中使用, 如果需要传递,则在A线程中创建了CSocket对象后,用CSocket::Detach( );分离出它内部的Socket句柄,并将这个句柄传递到B线程中,B线程创建一个CSocket对象并CSocket::Attach这个句柄,之后才能使用这个CSocket对象。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧