我开发一个C/S模式的程序,服务端的功能做成了多个DLL模块。其中有一个功能独立出来写时(重新建立新工程,分C/S),客户端采用API的SOCKET,没用CSocket可以无误的运行,接收和发送都是采用多线程。但是当我把该功能集成到我的程序时,客户端出现无法接收数据的情况,代码基本上是一样的,只是我的客户端采用的是CSocket加多线程,而且传给多线程的参数是SOCKET,不是CSocket的对象。还有一点不同的是客户端接收的这个模块是一个子窗体,其他的都一样了,不知为什么不行。
    不知我说的能看懂不,还望大侠赐教,回贴有分呀!

解决方案 »

  1.   

    Socket,CSocket使用有一些区别,你不能直接替换,你可以在CSocket使用时,多增加一下信息看具体问题的原因
      

  2.   

    我在窗体类中用CSocket的Detach()成员函数分离出SOCKET再作参数传给线程的,但是接收数据就是有问题,但是我用DEBUG一步一步的运行又可以,直接运行就不行。
      

  3.   

    你还是用socket API去写吧!
      

  4.   

    我也想啊,当时没有想到用CSocket有这么多的麻烦,但是代码已经写了这么多,整体的结构已经固定了,再去改的话那又要花多少精力哦。
      

  5.   

    可能是同步的问题。你的服务器发送几次数据给客户端?你说debug的时候可以行的通可能因为debug的时候服务器发一个 客户端收一个 正好达到了同步的效果。用CSocket的话可以和CArchive和CSocketFile联合使用,这样收发就很简单了,而且同步问题直接就被屏蔽了 微软给你解决了。
      

  6.   

    目前正在学习WINSOCK,好资料啊!
      

  7.   

    对了 CSocket其实内置了多线程机制的。你客户端在一个线程里不断的监听,有请求就new一个CSocket的派生类,然后用这个派生类对象通讯就可以了。其次自己在派生类对象中重载OnConnect和OnReceive(看连接后是谁主动发送)在OnConnect和OnReceive里处理接收和发送功能。然后注意当连接断开后派生类对象要删除自己所占用的内存空间。或者是客户端在new这个派生类的时候就把他的指针保存到数组或者队列, 等到客户端关闭的时候delete这个指针数组或队列
      

  8.   

    在多线程里使用CSocket、CArchive、CSocketFile线程安全吗,会不会出现ASSERT提示框。
      

  9.   

    线程参数肯定是传递SOCKET,不然接受发送给谁都不知道。下面那个没看懂,你要知道 你要么使用SOCKETAPI 要么使用CSOCKET 对象,不要混用。差别比较大!
      

  10.   


    你可能没理解我说,是这样的//这个我通信的对象,但有的资料说在线程里使用直接使用CSocket会线程不安全
    CSocket m_Socket; //所以我从CSocket中分离出SOCKET,就用这个作参数传入线程,再用recv接收数据
    SOCKET sock;问题是现在在线程中recv会接收数据出现失败或错误的情况
      

  11.   

    谢谢"guo693"的提示,谢谢大家的帮助,我在这个博客找到了解决问题的方法。http://sunblog.72pines.com/multithread-and-csocket/