服务程序中使用socket问题

OwenKing 2008-03-26 08:54:18
做了一socket服务端DLL。用两种方式调用此DLL。

方式一:做成后台运行的服务器。用VC++6.0的ATL COM AppWizard写控制台服务程序,调用此DLL。在默认目录下运行,其他电脑作为socket客户端,能连接上。如果更换执行文件路径运行,其他客户端电脑就无法连接上,但是本机的客户则能连接上。

方式二:做成普通的界面程序。普通带界面程序调用此DLL,无论怎么更换执行文件路径,其他电脑都能正常连接socket服务器。

...全文
214 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenKing 2008-03-31
  • 打赏
  • 举报
回复
star119119 :
我也很是郁闷, 不应该出现这样的问题的。socket服务都做成了DLL文件, 而且就一个接口函数负责启动SOCKET服务。在带界面的程序下面运行正常, 在后台服务下面就是出现上面的问题。
star119119感谢您好心提供的帮助, 这个问题并不会影响我的项目进度, 但是就是没弄清其中原因, 心里有点疙瘩而已。
star119119 2008-03-31
  • 打赏
  • 举报
回复
看了你给的那个连接.目录是不会影响socket的.你的问题确实很奇怪.

还有服务器客户机运行在是否是同一个机器也是无关的.只要同一台机器能运行.放在同一网段的其他机器上也是可以运行的.

只能说你的代码其他地方有问题.仔细检查一下吧.
OwenKing 2008-03-31
  • 打赏
  • 举报
回复
是的,即使你不需要界面,但是要响应消息的话就要添那个参数.具体我也忘记了,我现在没有环境.查一下msdn吧
=================================
我试过SERVICE_INTERACTIVE_PROCESS,也没解决我的问题。
还有, 就是服务器和客户端同一台电脑的话, 客户端都能正常的连接到后台服务程序的。
star119119 2008-03-29
  • 打赏
  • 举报
回复
你指的是SERVICE_INTERACTIVE_PROCESS这个参数吗? 这个是用在带界面的服务程序中吧, 我现在要做成不带界面的服务程序。
=================================
是的,即使你不需要界面,但是要响应消息的话就要添那个参数.具体我也忘记了,我现在没有环境.查一下msdn吧
star119119 2008-03-28
  • 打赏
  • 举报
回复
你能确定客户端连接成功了么?

还有就是 用抓包软件分析一下,客户端发来的数据是否发过来了.目标端口是不是你服务器的端口.

还有就是你的accept是采用什么方式呢?阻塞? 还是事件监听的方式?

如果用setsockopt的话,监听accept事件转发自定义消息,这个在服务里面是不行的.
OwenKing 2008-03-28
  • 打赏
  • 举报
回复
star119119 :
我没有用postmessage和sendmessage, 线程之间的通信也没有。我只是怀疑是不是服务程序的消息处理时回堵塞,而界面程序的消息不会出现堵塞情况。因为,socket的accept在服务程序里永远没有触发过,也就是说客户端永远没有连接上过,是不是服务程序消息堵塞了, 对客户端的连接请求没处理。 而界面程序socket的accept时,只要有客户端连接请求立即通过。
star119119 2008-03-28
  • 打赏
  • 举报
回复
我是注销掉先前的服务了, 然后更换目录后再注册运行服务程序的。

我觉得可能是服务程序的消息派发问题。 在运行服务程序时,socket的accept是永远接收不到客户端的连接请求的。而在界面程序

时, socket的accept是能接收客户端连接请求的。
====================================
我明白了,你发送消息是用sendmessage函数吧??

这个函数只能将消息发送到窗口.

建议你用postmessage,以前我也遇见过这个问题.后来用的postmessage.

第一个参数指定窗口的指定null,即当前进程的所有线程.这样你就可以接受到消息了.还有就是注意数据存储的指针变量的内存控制.

这个地方需要多家注意.
OwenKing 2008-03-28
  • 打赏
  • 举报
回复
你指的是SERVICE_INTERACTIVE_PROCESS这个参数吗? 这个是用在带界面的服务程序中吧, 我现在要做成不带界面的服务程序。
OwenKing 2008-03-28
  • 打赏
  • 举报
回复
还有就是你注册服务的时候,加上与桌面交互的参数了么?有了那个才可以响应消息.
==============================
单纯做成后台服务程序也要加上与桌面交互的参数么?另外我的服务程序中也有串口通信, 串口通信的消息响应一切正常。
怎么加上与桌面交互参数, 在哪个函数里加? CreateService()吗? 这个函数好像没有那个参数。
star119119 2008-03-28
  • 打赏
  • 举报
回复
问题是:我用的几个抓包工具都存在这样的情况。socket客户端用connect()函数连接服务器时,如果没连接上服务器,则抓包工具不会显示connect()函数请求连接命令, 如果连接成功了connect()函数请求连接命令就会显
==================================
不会吧.这个怎么可能? 抓包程序可以抓所有数据包.而且只要你客户端 申请连接的时候就会发送请求包的.这个包和你发送数据的包是不一样的.

对了, 忘记说了, 我做成带界面的服务程序后, 一切正常
==============================
这个就是因为服务程序无法接受窗口消息的缘故造成的.

服务程序无法接受窗口消息,但是可以接受自定义消息.......................

还有就是你注册服务的时候,加上与桌面交互的参数了么?有了那个才可以响应消息.

OwenKing 2008-03-28
  • 打赏
  • 举报
回复
对了, 忘记说了, 我做成带界面的服务程序后, 一切正常
OwenKing 2008-03-28
  • 打赏
  • 举报
回复
star119119 :
抓包程序 是 经过到你的网卡的数据包都会显示出来.不区分什么连接成功与不成功.我也是这样认为的。
问题是:我用的几个抓包工具都存在这样的情况。socket客户端用connect()函数连接服务器时,如果没连接上服务器,则抓包工具不会显示connect()函数请求连接命令, 如果连接成功了connect()函数请求连接命令就会显示。

还有我是按照“让客户端 反复请求.抓取 请求的包. ”
star119119 2008-03-28
  • 打赏
  • 举报
回复
用过几个抓包工具, 对于其他电脑的socket请求连接等信息,如果连接成功则有数据显示, 否则没数据显示。
====================

抓包的时候进行过滤啊,指定某一台计算机实验.

然后分析包的内容.也许是效验出了错,也许是包没有正确发送,等等很多原因.

让客户端 反复请求.抓取 请求的包.

还有就是 只有连接成功有信息的话................这是什么意思?

抓包程序 是 重要经过到你的网卡的数据包都会显示出来.不区分什么连接成功与不成功.
OwenKing 2008-03-28
  • 打赏
  • 举报
回复
用过几个抓包工具, 对于其他电脑的socket请求连接等信息,如果连接成功则有数据显示, 否则没数据显示。
proad 2008-03-28
  • 打赏
  • 举报
回复
我也遇到过类似的问题,相关帖子在这里:http://topic.csdn.net/u/20070412/12/1a50f1d9-2e12-43d4-aae7-c96203785143.html

问版主两个问题:
1、我当时是xp操作系统下遇到问题,你的操作系统呢?
2、我用的是瑞星杀毒软件,我怀疑有可能是瑞星的BUG,它要对所有socket程序把关,是不是它把某个目录下该dll的socket禁用了?

还有就是楼上所说,抓包是个好的分析方法。
star119119 2008-03-28
  • 打赏
  • 举报
回复
(::WSAAsyncSelect(info->sd, hWnd, WM_TCPEVENT, (info->server ? FD_READ : FD_CONNECT)|FD_CLOSE)

函数是这个 不是setsockopt,刚才说错了
OwenKing 2008-03-27
  • 打赏
  • 举报
回复
我在更换目录之前,是先停止服务程序, 然后将服务程序和DLL文件一起更换新路径, 再执行服务程序的
star119119 2008-03-27
  • 打赏
  • 举报
回复
执行文件和DLL肯定在同一目录下

首先你要看一下 服务注册以后的执行路径是多少.服务一旦注册以后他的执行路径就是固定的了.不能更改服务程序的路径

可以通过修改注册表.

但是我还是不太清楚你的问题.
OwenKing 2008-03-27
  • 打赏
  • 举报
回复
star119119 :
我是注销掉先前的服务了, 然后更换目录后再注册运行服务程序的。

我觉得可能是服务程序的消息派发问题。 在运行服务程序时,socket的accept是永远接收不到客户端的连接请求的。而在界面程序时, socket的accept是能接收客户端连接请求的。
star119119 2008-03-27
  • 打赏
  • 举报
回复
我在更换目录之前,是先停止服务程序, 然后将服务程序和DLL文件一起更换新路径, 再执行服务程序的
==========================================
这个不是你停止服务的问题.

首先服务是需要注册的.他会指定一个路径,记录在注册表里面.

你可以通过你的服务名在注册表里面搜索这个服务.看看他的路径和你现在的位置是否一致.

服务的启动 路径不是你程序在哪里就可以的.他是由操作系统启动.他的执行文件路径要和注册到操作系统内部的路径一致.
加载更多回复(4)

18,356

社区成员

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

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