设计已经做得差不多了,但由于以前没有做过无界面的Socket程序,我想在做之前请教一下:
(前提:在服务中使用MFC已经解决了)1) 在没有界面的Windows服务中有否可能使用用户界面线程?
   //主线程也是没有界面的
   //不想使用工作者线程的原因是没法把线程入口点定义到类里面
   //把m_pMainWnd置成空,可以使用么?2) 有人说在多线程中CSocket::OnReceive可能会不响应,是不是只针对工作者线程?有办法解决么?
   //这对用户界面线程,有没有同样的问题?
   //时间关系,最好不直接调用WindowsApi.3) AfxSockInit()和CoInitialize()需要调用吗?4) 如果在子线程里面创建CSocket,则不需调用Detach和Attach;对吗?

解决方案 »

  1.   

    1)在没有用户界面的程序中一般开的是工作线埕(不要开启GUI线埕);
     线埕定义到类里面去不是很简单吗?
    static DWORD WINAPI ThreadFucn()
    2)CSOCKET不适合用多线埕,如果要开多线埕最好用API不用MFC的类;
    3)AfxSockInit()是要调用的(如果用的是CSocket)
    4)同2)
      

  2.   

    4)如果你在子线埕里使用了CSocket那么每次都要有create(),connect()的过程
    那也是为什么CSocket::OnRecice()在多线埕中收不到消息通知的原因了;当然
    在子线埕中你没必要使用Detach和Attach;
      

  3.   

    Thanks alot gdy119.1) 用static方法当然可行,但是会访问不到类成员的。因为Socket的Handle是做为私有存放在类中的...
    //GUI线程完全不可行吗?2) 有人在多线程中用过CSocket么?还是大家都用的是WinApi?如果这样我会很郁闷...:-(
      

  4.   

    我不懂...。为什么每次Create(), Connect()就会收不到消息通知呢。
    gdy119可以再帮帮忙吗。另开窗给分都可以。
      

  5.   

    服务里可以开UI线程,不过一般是不开的,除非你要接收消息,做服务很复杂,做有界面的服务更复杂.
    推荐使用API,不要用CSocket
      

  6.   

    可不可以这样理解:既然使用了多线程,就没有必要再使用异步事件触发来判断有否新的包过来;直接使用同步的ReceiveFrom也可以?但这样一个连接就要对应一个Socket和一个Thread...。若可以使用OnReceive的话,可以使用一个Socket和一个Thread来处理很多的客户连接,只要在OnReceive中switch一下客户端的IP就可以了。我的理解对吗?
      

  7.   

    在你的Socket执行的线程中加一个消息循环就可以了
      

  8.   

    hjcao_wei请告诉我怎么做好吗?
      

  9.   

    to:) 用static方法当然可行,但是会访问不到类成员的。因为Socket的Handle是做为私有存放在类中的...
    //GUI线程完全不可行吗?2) 有人在多线程中用过CSocket么?还是大家都用的是WinApi?如果这样我会很郁闷...:-(
    //-------------------------------------------------------------------------------------
    GUI线埕完全不行!
    多线埕中用CSocket容易出错,因为CSocket是封状的wsaasyncselect()模型必须要有窗口接收!
    所以在多线埕中投递消息比较麻烦,但是还是可以用多线埕的!
    怎么访问不到类的成员? 你将类的指针带到线埕里面去嘛!!!!! 
      

  10.   

    CSOCKET必须要有消息循环,意味着必须有个界面让它传递消息,
    CSOCKET不支持多线程(指工作者线程)
      

  11.   

    danscort2000 说得不错,如果要使用消息方式通知数据的到来,必须要有窗口(无论这个窗口是否显示出来),这是消息驱动系统的更本要求。
    建议不要用消息方式,可以用 事件、I/O 重叠 或IOCP.
      

  12.   

    OK, 看来俺决定放弃使用消息方式来做的方法。
    那末,一个线程一个Socket,使用CSocket::ReceiveFrom()来做Polling.最后请教一下,创建CSocket的实例时,如果在线程外面Create好然后做为参数传递到线程方法中,是不是需要这样:(我没有真的编过,所以请各位高人指教了)外面:AfxSockInit();
    CSocket *mySocket = new CSocket();
    mySocket->Create(xxx,xx,xx)
    AfxBeginThread(myFunc, (LPVOID)mySocket->Detach());
    delete mySocket;里面:
    static UINT myClass::myFunc(LPVOID pParam)
    {
      CSocket mySocket;
      SOCKET socketHandle = (SOCKET)pParam;
      if (socketHandle != NULL)
      {
         mySocket->Attach(socketHandle);
         while (true)
           mySocket->ReceiveFrom(buf, xxx, xxx, xx);
      }
    }请问:
    这样的程序没有使用消息方式来用CSocket,可以运行吗?关于Detach和Attach,我不是很清楚Detach该运行在Create前还是后,在Attach前还要不要再对于Attach到SOCKET的那个Socket再做一次Create。在外面的delete mySocket,是否会影响到里面的Socket?各位能否指教?我真罗嗦...这是俺这个话题的最后问题,解决了马上结贴子,谢谢。
      

  13.   

    已经在前面回答你了,不可以,
    即使你在线程中没有使用消息函数,
    但是CSOCKET本身有一个消息循环,如果找不到一个有效指向的WINDOW来发送,系统自动报错的。
    所以还是不行。
      

  14.   

    原来如此
    怪不得我在线程中使用CSocket经常出错
    学习了
      

  15.   

    我正好在写类似的东西,我以亲身经历告诉你:绝对别用CSocket,麻烦多多。就用SOCKET虽然麻烦点儿,但绝对没有莫名奇妙的问题
      

  16.   

    我觉得在多线程中用CSocket很方便,我现在就在多线程中用CSocket传文件,思路是每个CSocket一个UI线程。