社区
网络编程
帖子详情
CAsyncSocket的多线程问题
nightsuns
2004-12-03 10:25:11
一共两个线程,我要做到一个线程创建CAsyncSocket对象,另一个线程来释放CAsyncSocket对象,
但发现MFC的内部为和线程相关,怎么解决?
它内部总是:
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
取得线程相关信息,再对SOCKET进行操作。
...全文
409
15
打赏
收藏
CAsyncSocket的多线程问题
一共两个线程,我要做到一个线程创建CAsyncSocket对象,另一个线程来释放CAsyncSocket对象, 但发现MFC的内部为和线程相关,怎么解决? 它内部总是: _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState; 取得线程相关信息,再对SOCKET进行操作。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nightsuns
2004-12-06
打赏
举报
回复
谢谢各位的解答,现在我已经自己封装,感觉用起来比较放心。
oyljerry
2004-12-03
打赏
举报
回复
线程局部存储,传递对象来
kingzai
2004-12-03
打赏
举报
回复
MFC的SOCKET类(包括CAsyncSocket,CSocket)不能够跨线程使用。原因是MFC使用了TLS(线程局部存储来管理这些SOCKET对象。如果一定要跨线程传递一个SOCKET对象,必须调用其Detach和Attach函数,你可以这么解决
nightsuns
2004-12-03
打赏
举报
回复
回复人: jiangsheng(蒋晟.MSMVP2004Jan) ( ) 信誉:257 2004-12-03 10:53:00 得分: 0
不能跨线程访问CAsyncSocket之类使用了线程局部存储的程序
其实也不是跨线程,我会在第一个线程启动以后,将这些指针存入一个全局域中,在第二个线程
初始化的时候将之写入thread local中。不知道这种方法可行吗?
nightsuns
2004-12-03
打赏
举报
回复
那有什么好的解决方案没有?
蒋晟
2004-12-03
打赏
举报
回复
不能跨线程访问CAsyncSocket之类使用了线程局部存储的程序
nightsuns
2004-12-03
打赏
举报
回复
回复人: DentistryDoctor(雅克医生<改行做程序员了>) ( ) 信誉:172 2004-12-03 10:43:00 得分: 0
线程直接最好直接传送SOCKET,你可以先在A线程中先Deatch,然后在B线程中Attach,用完后再在A线程中Attach.
之所以开后台线程,就是要它轮询,前台可以做其它的事。前台也不维持消息循环。
DentistryDoctor
2004-12-03
打赏
举报
回复
线程直接最好直接传送SOCKET,你可以先在A线程中先Deatch,然后在B线程中Attach,用完后再在A线程中Attach.
nightsuns
2004-12-03
打赏
举报
回复
回复人: danyueer(淡月儿:清水上的足音) ( ) 信誉:115 2004-12-03 10:27:00 得分: 0
CAsyncSocket自身采用了多线程,你用多线程来进行操作,容易出现问题
我是想做到跟GUI无关,我的后台线程只是轮询所有的监听端口,如果有连接就会新建一个对象。
不知道有什么其它的更好的方法吗?
nightsuns
2004-12-03
打赏
举报
回复
CAsyncSocket* PASCAL CAsyncSocket::LookupHandle(SOCKET hSocket, BOOL bDead)
{
CAsyncSocket* pSocket;
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (!bDead)
{
pSocket = (CAsyncSocket*)
pState->m_pmapSocketHandle->GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
else
{
pSocket = (CAsyncSocket*)
pState->m_pmapDeadSockets->GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
return NULL;
}
这是一段MFC的源码,我准备在第二个线程里面,用主线程的
pState->m_pmapDeadSockets
pState->m_pmapSocketHandle
来替换第二个线程的值,
不知道可行吗?
kingzai
2004-12-03
打赏
举报
回复
用CAsyncSocket的话,建议你在主线程中创建Socket,不然问题会很多。
因为CAsyncSocket使用了一个与主线程有关的隐藏的窗口来实现回调过程
DentistryDoctor
2004-12-03
打赏
举报
回复
这是为了实现从SOCKET到CAsyncSocket*,这个不是线程安全的。
因为_afxSokThreadState实际上是线程局部存储的。
danyueer
2004-12-03
打赏
举报
回复
CAsyncSocket自身采用了多线程,你用多线程来进行操作,容易出现问题
weiziyuner
2004-12-03
打赏
举报
回复
对 线程局部存储 不熟,不过对于socket有个原则就是:
能不要用CSocket和CAsyncSocket类就尽量不要用,因为它们不是类型安全的
到现在为止我没有发现有什么地方一定要用上面两个类的地方,自己封装一个类
照样可以工作的很好:)
nightsuns
2004-12-03
打赏
举报
回复
其实,和是否是thread local关系不大,关键是前台线程不会主动地去检测是否有后台
对象过来,我现在是想在后台线程里面检测和构造对象,然后放入一个线程共享的数组
里面。
CA
sync
Socket
基于tcp的单线程聊天室
使用
CA
sync
Socket
建立的基于tcp协议的单线程聊天室,支持多人聊天,支持点对点和广播方式。vs2008下编译运行,默认最多连接10个客户端。
多线程
文件网络传输(源代码)
用vc6.0实现了
多线程
的网络文件传输,它主要用到了
CA
sync
Socket
类
vc异步
多线程
网络聊天室
用
CA
sync
Socket
结合
多线程
做的简单demo示例,发上来蹭点分,高手莫笑
C
Socket
类的几篇期刊文章
在VC_6_0中利用C
Socket
类实现双机通讯,用C
Socket
实现网络文件的传输,
多线程
文件传输的实现方法及其性能的研究
使用VC++的网络编程总结
1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows
Socket
s 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 1.3.5 套接口属性 2.基本的Windows
Socket
s API 编程 2.1 常用函数 2.2 TCP 实例 2.3 UDP 实例 2.4
Socket
通信阻塞的解决方法 3.MFC 下的
Socket
编程的类 3.1
CA
sync
Socket
类 3.2 C
Socket
类 3.3 Windows
Socket
s:带存档的套接字的工作方式 3.4 流式套接字通信的操作顺序 3.5 使用
CA
sync
Socket
类 3.6 从套接字类派生 3.7 套接字通知 3.8 一个使用C
Socket
类的网络通信实例 3.8.1 服务器端应用程序设计(ServerDemo) 3.8.2 客户端应用程序设计(项目名称ClientDemo) 4.套接字的托管实现 4.1 System::Net::
Socket
s 命名空间 4.2 实例:一个新邮件检查器 5. 怎样实现服务器端
多线程
的
socket
功能?
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章