winsock编程中的多线程

Mactanald 2000-02-28 02:15:00
我用winsock编程实现TCP/IP网络通讯,其中使用了多线程,但在线程中使用序列化时出现ASSERT错误,不知如何解决?
...全文
570 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fmding 2001-10-08
  • 打赏
  • 举报
回复
up
cnss 2001-07-04
  • 打赏
  • 举报
回复
关注
deepwater 2000-03-01
  • 打赏
  • 举报
回复
也许我需要你的代码
Mactanald 2000-03-01
  • 打赏
  • 举报
回复
首先感谢deepwater!使用你的方法二,我在第二线程中能正常进行序列化,但接下来,在第一线程中进行序列化时却出现与上次同样的错误,请问该如何解决?
deepwater 2000-02-29
  • 打赏
  • 举报
回复
方法二我自己也没试过.
deepwater 2000-02-29
  • 打赏
  • 举报
回复
You are wellcome
oo 2000-02-29
  • 打赏
  • 举报
回复
deepwater,非常感谢你。现在ok了。
liu_z_j 2000-02-29
  • 打赏
  • 举报
回复
关注
deepwater 2000-02-29
  • 打赏
  • 举报
回复
方法一 ==> 我用过的方法,繁点

我们需要用到CAsyncSocket的一个protected成员函数,所以我们得定义一个CAsyncSocket或CSocket派生类,比如叫 CMySocket,然后写这么个成员函数:

void CMySocket::AttachSelf()
{
if(CAsyncSocket::LookupHandle(m_hSocket,FALSE)==NULL)
Attach(m_hSocket);
}

现在在第一线程中创建一个CMySocket对象pSock,再将这个指针传给第二线程,然后在第二线程中对这个指针调用
pSocket->AttachSelf();
现在你就可以在第二线程中尽情的使用创建于第一线程的pSocket了.

方法二 ==> 简单点,但未试过

不传递CAsyncSocket或CSocket对象指针,而传递socket handle,然后再第二线程中用FromHandle(hSocket)得到一个临时CAsyncSocket对象.
思想类似,应该可行.

Tell me your result
oo 2000-02-29
  • 打赏
  • 举报
回复
请教deepwater,具体如何做?怎么attach?能不能麻烦你把关键的代码贴出来,谢谢!
deepwater 2000-02-28
  • 打赏
  • 举报
回复
我有过类似经历.
对于某些Windows资源如窗口,GDI,包括socket的Handle,MFC采用一个线程local的数据结构来保存他们,当你使用与之对应的CWnd,CDC,CSocket对象时,MFC会在这个线程local的数据结构中寻找对象的Handle.当你将一个CSocket对象的指针传到另一个线程中时,MFC在这个线程local的数据结构中找不到Handle,会产生ASSERT错误.

解决方法:
传递socket的Handle而非CSocket对象,然后将此Handle在第二线程中与创建在第二线程中的CSocket对象Attach即可.

It will work!
netmare 2000-02-28
  • 打赏
  • 举报
回复
如果你用CSocket就没有WHQ所说的情况,但用CAsyncSocket有可能出错,可以按WHQ的方法解决.
WHQ 2000-02-28
  • 打赏
  • 举报
回复
MFC对SOCKET的封装类不直接支持多线程,你不能在工作线程中读/写SOCKET,我的做法是用多线程处理客户的请求,处理完后通过向主窗口发送一自定义的消息把处理结果转到主线程发送出去。
xenogear 2000-02-28
  • 打赏
  • 举报
回复
需要看源代码
forgettor 2000-02-28
  • 打赏
  • 举报
回复
关注
hayoo 2000-02-28
  • 打赏
  • 举报
回复
用CRITICAL_SECTION

15,471

社区成员

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

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