服务为何停止不了和socket如何在internet上通信问题??

peter115 2003-09-13 09:34:06
我有两个问题,
1.我用ATL写了一个service程序,主要是利用socket的完成端口模型来实现一个
并发服务器的功能,这个服务已经运行成功,通信也没有问题,但是我在服务器管理器中不知道如何停止呀?一般的windows服务程序,只要一启动马上就启动,然后也可以马上关闭掉?但是我这个点击停止服务就是关闭不了,我不知道这是为什么,我想可能是不是那个我的完成端口模型没有写退出的程序,还是说在服务程序需要加入什么退出的代码呀?

2.我写了一个类似qq的小的聊天程序,是通过Winsock2.2版本实现的,在局域网当中测试完全通过没有问题,然后我想在Internet上实现,现在我通过在公司的局域网的服务器上面的公网IP上可以,然后客户端在另外一个城市可以完全通信没有问题,但是我在公司局域网下面通过服务器的这个网关代理出去的机器就不行了,就是说在不是服务器的那一台机器不使用公网IP就不行了,因为所有机器都是通过这个公网IP出去的,我想应该是这个原因,我现在就不知如何解决这种问题,当我在局域网通信都没有问题的情况下的时候我想跨internet的时候应该怎样办?我现在还写了一个视频会议软件在局域网可以,但是是通过组播,但是在internet上组播肯定是不行了如何解决呢?
...全文
38 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyx 2003-09-15
  • 打赏
  • 举报
回复
关于问题2,俺建议你去网络编程中去找资料吧
类似的问题讨论得非常热烈。
但,俺没有看到特别合适的办法。
zzyx 2003-09-15
  • 打赏
  • 举报
回复
关于1
不知道你是如何实现的完成端口的状态查询以及数据处理的,是在主线程呢还是另外的线程?

如果是在主线程,你是类似如下的代码吗
while(true)
{
nEventID=WSAWaitForMultipleEvents(...);
...
WSAEnumNetworkEvents(...)
...
}

其实你可以理由atl向导生成的代码改造的
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{

nEventID=WSAWaitForMultipleEvents(...);
WSAEnumNetworkEvents(...)
...
DispatchMessage(&msg);
}
这样你就可以得到退出的消息了。

如果是在另外的线程中执行完成端口的工作,那么就简单了,
在停止服务的时候,以上atl生成的消息循环将自动退出后,
你可以通知你的完成端口线程停止工作(这样是比较优雅的做法)。
……当然你也可以干脆就不管它,主线程停止了,它启动的线程自然也就停止了

另外,注意WSAWaitForMultipleEvents 的超时参数不要设置太长,否则,你在停止服务的时候,会发现等到的时间还是比较长



3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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