关于MFC中使用CSocket的问题?

一路飘过 2011-04-28 08:19:22
我开发一个C/S模式的程序,服务端的功能做成了多个DLL模块。其中有一个功能独立出来写时(重新建立新工程,分C/S),客户端采用API的SOCKET,没用CSocket可以无误的运行,接收和发送都是采用多线程。但是当我把该功能集成到我的程序时,客户端出现无法接收数据的情况,代码基本上是一样的,只是我的客户端采用的是CSocket加多线程,而且传给多线程的参数是SOCKET,不是CSocket的对象。还有一点不同的是客户端接收的这个模块是一个子窗体,其他的都一样了,不知为什么不行。
不知我说的能看懂不,还望大侠赐教,回贴有分呀!
...全文
177 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 guo693 的回复:]
对了 CSocket其实内置了多线程机制的。你客户端在一个线程里不断的监听,有请求就new一个CSocket的派生类,然后用这个派生类对象通讯就可以了。其次自己在派生类对象中重载OnConnect和OnReceive(看连接后是谁主动发送)在OnConnect和OnReceive里处理接收和发送功能。然后注意当连接断开后派生类对象要删除自己所占用的内存空间。或者是客户端在new这个派生类的时候就把……
[/Quote]
我程序的通信方法和你说的基本上是一样的,但是这个问题该怎么解决呢?
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 aaadddzxc 的回复:]
线程参数肯定是传递SOCKET,不然接受发送给谁都不知道。下面那个没看懂,你要知道 你要么使用SOCKETAPI 要么使用CSOCKET 对象,不要混用。差别比较大!
[/Quote]

你可能没理解我说,是这样的

//这个我通信的对象,但有的资料说在线程里使用直接使用CSocket会线程不安全
CSocket m_Socket;

//所以我从CSocket中分离出SOCKET,就用这个作参数传入线程,再用recv接收数据
SOCKET sock;

问题是现在在线程中recv会接收数据出现失败或错误的情况
xengine-qyt 2011-04-28
  • 打赏
  • 举报
回复
线程参数肯定是传递SOCKET,不然接受发送给谁都不知道。下面那个没看懂,你要知道 你要么使用SOCKETAPI 要么使用CSOCKET 对象,不要混用。差别比较大!
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guo693 的回复:]
可能是同步的问题。你的服务器发送几次数据给客户端?你说debug的时候可以行的通可能因为debug的时候服务器发一个 客户端收一个 正好达到了同步的效果。用CSocket的话可以和CArchive和CSocketFile联合使用,这样收发就很简单了,而且同步问题直接就被屏蔽了 微软给你解决了。
[/Quote]
在多线程里使用CSocket、CArchive、CSocketFile线程安全吗,会不会出现ASSERT提示框。
guo693 2011-04-28
  • 打赏
  • 举报
回复
对了 CSocket其实内置了多线程机制的。你客户端在一个线程里不断的监听,有请求就new一个CSocket的派生类,然后用这个派生类对象通讯就可以了。其次自己在派生类对象中重载OnConnect和OnReceive(看连接后是谁主动发送)在OnConnect和OnReceive里处理接收和发送功能。然后注意当连接断开后派生类对象要删除自己所占用的内存空间。或者是客户端在new这个派生类的时候就把他的指针保存到数组或者队列, 等到客户端关闭的时候delete这个指针数组或队列
ssyyo_bj 2011-04-28
  • 打赏
  • 举报
回复
目前正在学习WINSOCK,好资料啊!
guo693 2011-04-28
  • 打赏
  • 举报
回复
具体的还是要自己排查出原因 然后对症下药
guo693 2011-04-28
  • 打赏
  • 举报
回复
可能是同步的问题。你的服务器发送几次数据给客户端?你说debug的时候可以行的通可能因为debug的时候服务器发一个 客户端收一个 正好达到了同步的效果。用CSocket的话可以和CArchive和CSocketFile联合使用,这样收发就很简单了,而且同步问题直接就被屏蔽了 微软给你解决了。
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
我也想啊,当时没有想到用CSocket有这么多的麻烦,但是代码已经写了这么多,整体的结构已经固定了,再去改的话那又要花多少精力哦。
Eleven 2011-04-28
  • 打赏
  • 举报
回复
你还是用socket API去写吧!
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
我在窗体类中用CSocket的Detach()成员函数分离出SOCKET再作参数传给线程的,但是接收数据就是有问题,但是我用DEBUG一步一步的运行又可以,直接运行就不行。
oyljerry 2011-04-28
  • 打赏
  • 举报
回复
Socket,CSocket使用有一些区别,你不能直接替换,你可以在CSocket使用时,多增加一下信息看具体问题的原因
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
随便发表见解
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
大家帮帮忙咯
一路飘过 2011-04-28
  • 打赏
  • 举报
回复
谢谢"guo693"的提示,谢谢大家的帮助,我在这个博客找到了解决问题的方法。

http://sunblog.72pines.com/multithread-and-csocket/

18,356

社区成员

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

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