刚开始学winsock编程,使用MFC中的CSocket类,对各教材的标准例程有两问题。问题一:为什么总是要继承一个CSocket类,然后使用派生的类来处理信息的发送、接受等操作。问题二:当监听socket发现一个客户试图连接时,会new一个socket,然后用新的socket与客户通讯。我想知道,是不是每new一个socket实际上就是创建一个新线程?如果不是,如何保证各个socket能独立与客户通讯呢?有关问题请各位详细解答,不胜感激!

解决方案 »

  1.   

    CSocket只完成公用的操作,没有你自己想要的代码,所以继承后补充自己的东西。第二个问题正如你所说的那样。
      

  2.   

    当一个网络事件发生时,通过MFC的信息结构,就可以由CAsynsSocket或CSocket的Callback function按照事件来处理.最常用的有OnReceive(),OnSend(),OnAccept(),OnConnect(),OnClose()等函数,它们分别在收到信息时,发送时,侦听时,连接时,关闭时触发.每个用户做网络要求都不同,当然会重写这些信息处理.
      

  3.   

    1. 如果只是简单的操作,就没有必要从CSocket派生自己的类了,CSocket类中带有的成员函数完全可以完成需要的功能。 2。是这样的,其实如果你不用MFC的CSocket类,自己用纯socket api来编程的话会对这个问题理解得更为透彻^_^   还有什么问题欢迎你来网络版继续讨论^_^
      

  4.   

    其实我觉得楼主不如从基本的纯socket api学起会让你对socket的机制理解得更为透彻                       ------   纯属个人意见,视个人喜好而定:)
      

  5.   

    to PiggyXP:我也想从winsocket api开始,可现在是维护一个老程序,没办法。还有几个问题:通常从CSocket派生的类会在OnReceive过程中调用窗口中的一个方法(在这个方法类中中读取实际接收到的数据),如果该窗口正好打开一个新的模式窗口,是否回阻塞数据的接收?如果每次new一个新的socket就是开了一个新的线程,那么这个线程如何结束(何时)?是不是客户连接一断开就自动结束?还需要我delete它吗?
      

  6.   

    有不有使用VC Csoket作DLL的,用户操作介面只提供如下:
    int InitSocket(...);
    int Send(...);
    int Receive(...);
    int CloseSocket(...);
    ......
    这样可供VB,等其它调用。
    请问,你样可行吗,见网上有这样的例子吗??
      

  7.   

    to difa:你需要的是一个控件,VB中包含一个WinSock的控件,可以设置监听的端口号,然后如果有接收到数据就会触发一个Receive的事件。具体内容可查看MSDN中的VB控件参考部分。
      

  8.   

    如果每次new一个新的socket就是开了一个新的线程,那么这个线程如何结束(何时)?==============================================================================   每次新开的监听线程,是需要你手动想办法结束的
      

  9.   

    这要看你在哪儿new,比如在C**app的InitInstance中new,那么就要等到
    整个程序结束是销毁。