超级郁闷,为什么socket封装到windows服务就不能正常运行了?

antshome 2005-07-31 10:45:19
问题如下:
我在一个对话框程序里调试好了socket的服务端
后来想把程序封装成windows服务,代码是移值过去的

但是不能用
m_pSocket->Create()
m_pSocket->Listen()
都是成功的,
但是接收不到客户端的连接请求(OnAccept)

难道windows服务(win32控制台项目)和普通的MFC程序里,socket用法有什么不一样吗?
...全文
370 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
antshome 2005-08-01
  • 打赏
  • 举报
回复

或者告诉我,除了SetTimer这种方法以外,如何定时执行某个操作
antshome 2005-08-01
  • 打赏
  • 举报
回复
to fzd999(花差花差)


看来还只能用API来做了




另外,还要请教一下,为什么服务里不能用SetTimer启动定时器?
darkstar21cn 2005-08-01
  • 打赏
  • 举报
回复
服务程序最好不要使用SetTimer,应该使用一个进程来监听端口。
fzd999 2005-08-01
  • 打赏
  • 举报
回复
antshome(忧郁的苦瓜),我做过类似的事情,由于有太多权限方面的问题没有成功,后来用Socket API,直接事件异步模式解决了问题,开发加单体测试花费时间是两个工作日,建议你不要犹豫不决了,在Service里面弃用MFC中的CSocket,采用Socket API,并不困难的。
antshome 2005-08-01
  • 打赏
  • 举报
回复
TO orbit(走了走了)

我加了调试信息,写到windows日志查看器里,看到的都是正常的

TO fzd999(花差花差)
是你说的意思

本来是没有对话框的,直接是类里封装好的,不行后,我才加了个对话框





另外还有个问题

::SetTimer好像也不能在服务里运行
fzd999 2005-08-01
  • 打赏
  • 举报
回复
antshome(忧郁的苦瓜),我了解你的情况了,你在服务中指定了桌面交互,然后显示了一个对话框,然后对话框上有一个按钮,你想按了它就能创建Socket,是吧?

这里存在一个问题,一是你的对话框是怎么创建的,是直接在Service里面使用MFC类库,还是CreateProcess。假如你是直接使用MFC,那么想在Service中创建套接字是需要重新设置权限的,具体手法比较复杂。假如是CreateProcess,应该可以,可能是你程序哪儿写错了。

原则上还是建议你采用Socket API,一方面MFC封装的并不好,另一方面用Socket API也不容易出错。
吹泡泡的小猫 2005-08-01
  • 打赏
  • 举报
回复
在服务中使用MFC是可以的,你是如何确定

m_pSocket->Create()
m_pSocket->Listen()
是调用成功的
antshome 2005-08-01
  • 打赏
  • 举报
回复
可是我是从CDialog继承的对话框
antshome 2005-08-01
  • 打赏
  • 举报
回复
我改用API写了,已经搞定,谢谢各位
softrain 2005-08-01
  • 打赏
  • 举报
回复
“对话框窗体是可以显示出来的,按钮也能响应事件”和MFC是不相关的两件事,用纯win32API也是可以创建窗口应用程序的,而且运行效率比MFC高。
你可以在控制台程序中调用MessageBox,也会弹出窗口。
DentistryDoctor 2005-08-01
  • 打赏
  • 举报
回复
我想,CSocket内部主要用到了消息机制的原因吧。

可以考虑用API,或是自己封装一个类。
Caps77 2005-08-01
  • 打赏
  • 举报
回复
DLL ,多线程,服务,三种情况下使用SOCKET API一般不容易出错,MFC在这三种情况下一直都存在着一些悬而未决的BUG。
antshome 2005-07-31
  • 打赏
  • 举报
回复
对话框窗体是可以显示出来的,按钮也能响应事件

说明Service里是可以用MFC的类库吧
antshome 2005-07-31
  • 打赏
  • 举报
回复
我的程序是Service启动时,有一个对话框弹出来,有两个按钮,单击后启用socket,这样也不行的?

一定要用API来写?
fzd999 2005-07-31
  • 打赏
  • 举报
回复
默认情况下,Service是控制台程序,不能使用MFC类库,因此你不能在服务中使用CSocket类。解决的办法有两个,一是直接使用WinSocket2 API,二是用Service来CreateProcess一个进程,然后在这个进程里面使用CSocket。

建议直接使用WinSocket API,因为MFC封装做的并不好,而且通讯模式也仅限于阻塞和消息异步,其中消息异步一定要和一个窗口绑定,这在Service里面几乎是个无理的要求。至于如何使用Socket API,你可以参考《Windows网络编程》一书。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧