有一年多没有弄VC++了,近来想做一个小软件,重新拿了起来,却发现自己越来越对它不熟悉了。做了将近两年的NET开发,对VC++这种模式还真的不太适应了发现了一些问题,弱弱的问题,希望大家多多指教
    对于CSocket 类,大家一般怎么使用? 定义一个 CSocket 类的对象:
    CSocket ss;
然后就可以用这个对象来做事了,比如调用它的Send()方法发送数据,调用它的其它方法来进行我们要做的事情。现在问题出来了,我要用这个对象与别人进行通信,当别人发送信息给我这个套接字时,ss对象如何来接收这些信息。我们知道,CSocket类有一个 Receive()方法,可以用它来接收对方发来的信息。
问题是,我们什么时候调用Receive()方法来接收对方发来的信息。我们知道CSocket有个虚函数 OnReceive(),我们必须依靠这个虚函数来通知我们,什么时候调用Receive()方法接收信息。
     这个虚函数,是要我们来重写的,否则Receive()这个方法没有地方可写。看了别人N多的程序,大家都这是么写的:新建一个类,如CMySocket,这个类继承CSoket。并且在这个类里面新建一个指向程序主对话框的指针,(在CMySocket的构造函数里,初始化这个指针)。然后在CMySocket里重写OnReceive()这个虚函数,并且在OnReceive()里调用主对话框的一个函数,如主对话框的 OnReceive(),在主对话框中,编写我们的具体接收信息的方法。。
     对于这种访式的调用,本人十分迷惑
     1.既然CSocket 是MFC封装好的一个类,为什么我们不能直接使用这个类进行网络连接,接收数据,而必须自己继承这个类,用继承的类来构造自己的对象。
可不可以,直接用CSocket,而不用继承它,来实现上面的功能呢?
     2.我们用CMysocket继承了CSocket,并且我们在CMysocket类里面,保存了一个指向主对话框的指针,以便在重写Onreceive 时,调用主对话框的OnReceive函数。这样一来,我们的这个CMySocket类与主对话框,是紧密联系在一起的,它们有很强的偶合关系。
这样,这个CMysocket类就只能在主对话框内使用,如果我们新建了另外一个对话框,在这个对话框内我们也需要Socket连接,那么就不能用CMySocket这个类。
而且还有一个问题,假如,我们在主对话框内,要定义两个套接字对象,而且这两个对象在接收数据时,都有不同的操作。那么我们就不能把这两个对象都定义成CMySocket,因为这两个套接字对象的OnReceive事件里面所做的事情是不同的,它们不能共用同一个类的同一个函数。(当然我们可以想一些其它办法来解决这个问题,比如,在CMySocket里面添加一个字段 m_name,给每一个定义的对象取一个名字,这样在OnReceive()里面根据名字来做不同的事情)。      好了,跟据上面的论述,我们可以将它总结为:要使用CSocket 这个类,我们必须继承它,将它继承为CMysocket;如果我们的程序里使用到了多个套接字,而且这些套接字在接收数据时都要做不同的事情,那么我们就必须将CSocket继承为CMysocket1,CMysocket2,CMysocket3也就是一个类如CMysocket只能定义一个象。。
在面向对象里,这是多么可笑的结论,CSocket类是一个类,我们不能用它来做事情(除了继承它)!
                                  CMySocket是我们继承CSocket的一个类,我们不能用它来定义多个对象!如果我们想定义多个对象,我们必须为这些对象写n多个类。
这不是很荒唐吗?
期等高手正解!
等待中

解决方案 »

  1.   

    1 有待于确认
    2 这种用法本来就有问题,CMySocket应该只接收数据,不做处理,谁要处理谁就来要数据,就不存在你说的 问题了
      

  2.   


    问题是CMySocket 里面有一个对话框指针,这个指针的类型是写死了的,也就是CMySocket只能在这个对话框内使用了。
      

  3.   

    所以说你这样定义CMySocket 有问题啊
    你里面就定义一个数据链表,一个hwnd,OnRecive接收数据就插入链表,发送消息给hwnd,让他来取数据
    更通用一点,定义一个void指针,想怎么转换都行
      

  4.   

    很少用MFC的socket类
    有时用自己封装的socket类
    有时直接用socket API
      

  5.   

    同感  我用得比较多是  SOCKET API
      

  6.   

    CSocket的优势是基于事件处理,使用简便。劣势:必须在主线程中创建CSocket来捕捉事件,对于客户端数量比较少,通信量不过于频繁的通信情况比较适用.
    高性能服务器就不适合用CSocket来设计,应用socket API, 或是IOCP.
      

  7.   

    1. 要使用CSocket 这个类,我们必须继承它,
       其实这是优点不是缺点,为了更灵活的使用CSocket就从这里派生,并且必须派生。2. 如果我们的程序里使用到了多个套接字,而且这些套接字在接收数据时都要做不同的事情,那么我们就必须将CSocket继承为CMysocket1,CMysocket2,CMysocket3
        ===============================
       不是这个样子的,你可以只派生一个类,每一个连接用一个实例化对象与之对应,假如你有10000个连接,每一个连接创建一个堆对象,将所有的对象指针存在一个指针列表里面就可以检索和使用了。
    至于你说的每个Socket做不同的事情,它本来的基本功能就是收发,针对不同的连接,它能把接受来的不同功能分出去,把别人委托来的信息发给对方,就是作为一个Socket的基本任务了。
         慢慢体验类封装和面向对象吧,比API有更多的优势,至少我是这么认为。