关于CAsyncSocket在多线程中的使用问题!请SOCK高手帮忙!!谢谢大家!

zhangyiabc 2004-12-20 01:06:50
我知道CAsyncSocket、CSOCK之类MFC封装的SOCK类不是线程安全性的。下次一定用API来实现了。不过现在代码做了很多了,所以还是请大家帮忙!
情况这样的:
一、我在主EXE程序中用Loadlibrary调用一个DLL中的方法。同时是在EXE中启动了一个新的线程来调用这个DLL中的方法。
二、在这个DLL的方法中使用了基于CAsyncSocket的对象,我这里做的是SOCK客户端,所以用了CAsyncSocket.create()、Connect()方法来创建。
三、使用正常。我也能在CAsyncSocket的派生类中收到OnCreate和OnConnect事件。
四、为了保证长连接,我不会在这个线程结束时关闭SOCK,下次再调用DLL时再次收发就可以了。
五、问题现在是无论我在哪里主动Close()这个SOCK对象,总是会失败。好象这个SOCK对象是创建了一个CSockLisen窗口。每次都是HANDLE不对。
六、但是如果服务器断开无论何时,系统主动触发的OnClose()消息都能正确释放SOCK。

我想问的是,我如何主动安全释放在多线程中创建的异步SOCK?或者说我如何给这个SOCK窗口(CSockLisen)发消息,让它主动释放。
我知道这个问题有点难,所以如果真有能帮助到我或有好的建议的!谢谢大家了!共同进步!
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
viaboy 2005-03-16
  • 打赏
  • 举报
回复
up
jerry 2005-03-16
  • 打赏
  • 举报
回复
CAsyncSocket 就是绑定在一个窗口上的, 你可以看看AfxSocketInit()这个函数的代码. 它用来创建一个窗体.这个窗体专门用于处理CAsyncSocket的消息的.所以CAsyncSocket并不是运行在另一个线程里的.而是在主线程里运行的. 它只是通过消息来使得操作异步进行. 这是window socket 的典型应用

你看看微软的那么WSA开始的Socket函数,都是通过窗口消息来进行的
如WSASelect就需要一个窗口参数.

一般要实现一个多线程的socket都是自己来封闭socket的多线程操作. 在另一个线程中使用标准的select来实现多线程的异步操作

hunterliu001 2005-03-16
  • 打赏
  • 举报
回复
我以前的create和close都是放在线程内部操作的,就没问题。
wdz2003 2005-03-16
  • 打赏
  • 举报
回复
可以把CAsyncSocket.create和CAsyncSocket.close都放到主线程中,这样就没问题了
Kudeet 2004-12-20
  • 打赏
  • 举报
回复
MFCAsync.exe contains a Visual C++ 5.0 project sample that shows the communication techniques between a client (AsyncClient) and a server (AsyncServer) application using MFC CAsyncSocket class on each sides.
http://support.microsoft.com/default.aspx?scid=kb;en-us;192570
zhangyiabc 2004-12-20
  • 打赏
  • 举报
回复
这个例子我看了。是标准的对话框SOCK。当然没问题了,他没用到多线程。不过还是要感谢 yuanbocsut的好意:),谢谢!还有没有朋友对这个熟啊?
danielzhu 2004-12-20
  • 打赏
  • 举报
回复
绝对权威和经典:一个TCP,一个UDP
http://support.microsoft.com/default.aspx?scid=kb;en-us;185728
http://support.microsoft.com/default.aspx?scid=kb;en-us;214396

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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