问题如下:
我在一个对话框程序里调试好了socket的服务端
后来想把程序封装成windows服务,代码是移值过去的但是不能用
m_pSocket->Create()
m_pSocket->Listen()
都是成功的,
但是接收不到客户端的连接请求(OnAccept)难道windows服务(win32控制台项目)和普通的MFC程序里,socket用法有什么不一样吗?

解决方案 »

  1.   

    默认情况下,Service是控制台程序,不能使用MFC类库,因此你不能在服务中使用CSocket类。解决的办法有两个,一是直接使用WinSocket2 API,二是用Service来CreateProcess一个进程,然后在这个进程里面使用CSocket。建议直接使用WinSocket API,因为MFC封装做的并不好,而且通讯模式也仅限于阻塞和消息异步,其中消息异步一定要和一个窗口绑定,这在Service里面几乎是个无理的要求。至于如何使用Socket API,你可以参考《Windows网络编程》一书。
      

  2.   

    我的程序是Service启动时,有一个对话框弹出来,有两个按钮,单击后启用socket,这样也不行的?一定要用API来写?
      

  3.   

    对话框窗体是可以显示出来的,按钮也能响应事件说明Service里是可以用MFC的类库吧
      

  4.   

    DLL ,多线程,服务,三种情况下使用SOCKET API一般不容易出错,MFC在这三种情况下一直都存在着一些悬而未决的BUG。
      

  5.   

    我想,CSocket内部主要用到了消息机制的原因吧。可以考虑用API,或是自己封装一个类。
      

  6.   

    “对话框窗体是可以显示出来的,按钮也能响应事件”和MFC是不相关的两件事,用纯win32API也是可以创建窗口应用程序的,而且运行效率比MFC高。
    你可以在控制台程序中调用MessageBox,也会弹出窗口。
      

  7.   

    可是我是从CDialog继承的对话框
      

  8.   

    在服务中使用MFC是可以的,你是如何确定m_pSocket->Create()
    m_pSocket->Listen()
    是调用成功的
      

  9.   

    antshome(忧郁的苦瓜),我了解你的情况了,你在服务中指定了桌面交互,然后显示了一个对话框,然后对话框上有一个按钮,你想按了它就能创建Socket,是吧?这里存在一个问题,一是你的对话框是怎么创建的,是直接在Service里面使用MFC类库,还是CreateProcess。假如你是直接使用MFC,那么想在Service中创建套接字是需要重新设置权限的,具体手法比较复杂。假如是CreateProcess,应该可以,可能是你程序哪儿写错了。原则上还是建议你采用Socket API,一方面MFC封装的并不好,另一方面用Socket API也不容易出错。
      

  10.   

    TO orbit(走了走了) 我加了调试信息,写到windows日志查看器里,看到的都是正常的TO fzd999(花差花差)
    是你说的意思本来是没有对话框的,直接是类里封装好的,不行后,我才加了个对话框另外还有个问题::SetTimer好像也不能在服务里运行
      

  11.   

    antshome(忧郁的苦瓜),我做过类似的事情,由于有太多权限方面的问题没有成功,后来用Socket API,直接事件异步模式解决了问题,开发加单体测试花费时间是两个工作日,建议你不要犹豫不决了,在Service里面弃用MFC中的CSocket,采用Socket API,并不困难的。
      

  12.   

    服务程序最好不要使用SetTimer,应该使用一个进程来监听端口。
      

  13.   

    to fzd999(花差花差) 
    看来还只能用API来做了
    另外,还要请教一下,为什么服务里不能用SetTimer启动定时器?
      

  14.   


    或者告诉我,除了SetTimer这种方法以外,如何定时执行某个操作
      

  15.   

    我改用API写了,已经搞定,谢谢各位