自己做了一个可以支持MFC的系统服务,没有用ATL的COM架构。在ServiceMain中建立了一个CAsyncSocket对象,调用Create成功并用Connect试图连接到另一台服务器。
服务器端收到了连接请求并Accept了(可以保证服务器端代码无问题)。但是在服务中的CAsyncSocket对象始终没有响应OnConnect函数,百思不得其解。不知道是不是因为CAsyncSocket不是一个线程安全对象的原因。且该对象未经改动在其他Windows程序(不是服务)中工作正常。而我重写了CAsyncSocket并用WSAEventSelect和WSAWaitForMultipleEvents代替了原来的CAsyncSocket中的消息泵以后,该对象在服务中可以工作了,但是不稳定。所以我想请教各位达人,CAsyncSocket为什么在Windows NT Service中工作不正常呢?

解决方案 »

  1.   

    你的服务程序是System帐号吧。本地系统账号是一个很有特权的本地账号,因此你不应该用它运行任何共享软件应用程序。 但是,它没有网络权限,不能通过任何NT安全机制离开本地机器,包括文件系统、命名管道、DCOM或secure RPC。
      

  2.   

    不能访问网络资源,如共享、管道,因为它不能提供信任凭证,而只能使用空连接。 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 处的 NullSessionPipes 和 NullSessionShares 的值指明了可以被空连接访问的管道和共享。
      

  3.   

    楼上说的使用系统服务的系统帐户不能够访问系统资源,是不是包含SOCKET呢?
    如果我使用SOCKET API写服务,是可以正常运行的。
      

  4.   

    CAsyncSocket跟MFC的窗口消息打交道,而你的service是没有窗口,不知你是怎样在用?建议你使用api socket
      

  5.   

    CAsyncSocket跟MFC的窗口消息打交道,而你的service是没有窗口,不知你是怎样在用?
    ========
    应该不是这个问题,CAsyncSocket会在内部自己创建一个CSocketWnd创建类对象
      

  6.   

    嗯,SocketWnd的创建没有问题,就是不响应Socket的Events