socket tcp 以服务模式启动后无法收客户端数据

rlzlnet 2018-10-09 11:32:58
入口是main ,我检测参数以区分以服务启动或应用模式启动(这个无所谓,我代码可以直接改,不影响)
=========================================
详细说明:

---关于socket被我封在一个class里面了,只要声明就可以了,没有公开成员可以调用,比如 A m_a; 这就算使用了,只要它的生命周期不结束。
---应用程序编译时申请的是最高管理员权限(图标上会有个小盾牌),我电脑一般默认UAC

bug情况:
---以一般应用程序启动,所有功能正常。(包括非socket功能部分)
---注册到服务里面,然后启动,tcp可以发送数据,但收不到客户端传来的数据。
服务类型是SERVICE_WIN32_OWN_PROCESS 我用sc create把程序注册进去 依赖 depend= Tcpip


猜想:
---以应用模式启动会有个弹窗,不是UAC弹窗,是请求网络弹窗,我会点击许可。
---但以服务模式启动不会有这个,我不知道是不是这个原因。但也不知道如何去改动。

有谁知道解决办法吗?
...全文
354 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rlzlnet 2018-10-22
  • 打赏
  • 举报
回复
忙了好几天其它的,今天终于回到这个问题上来了 解决了。 原来是权限不够。 我单位的电脑,只有域用户,没有本机用户。之前懒,所以没有输出日志,我自己加入一个日志接口输出后才发现的。 socket能创建,但貌似消息有阻塞。 我程序里面还带有mssql2012访问,用的odbc连接。但这个和socket消息作用才能体现出来,之前一直没察觉。今天才发现没权限连数据库都连不上。 我还以为注册组件后运行环境更变了,配置文件读取不到,还特别的获取应用目录之类的。输出数据源用户密码都正确。 服务组件登录属性里特别指定了一下用户。 今天终于解决了,只能怪我电脑太奇葩了。。。。。。
smwhotjay 2018-10-09
  • 打赏
  • 举报
回复

你需要输出log到文件 查看哪里出了问题
赵4老师 2018-10-09
  • 打赏
  • 举报
回复
请检查每个函数调用的返回值。

用调试器(OD,WINDBG等)调试服务程序
To debug the initialization code of a service application, the debugger must be attached when the service is started. This is accomplished by creating a registry key:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProgramName


The ProgramName is the image file for the service application you are debugging. Do not specify a path. For example, the ProgramName might look like MyService.exe.

Under this key create a string data value called Debugger. The value of this string should be set to the full path of the debugger that will be used. For example,

c:\Debuggers\windbg.exe



In addition to setting this registry key, the service application must be marked as "interactive". This allows your service to interact with the desktop, and allows the debugger window to appear on your desktop.

This again requires modifying a registry key: you must bitwise-or the type entry for your service with 0x100 (this is the value for SERVICE_INTERACTIVE_PROCESS according to Winnt.h). The exact location and name of this registry entry varies. For example:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceKey


Finally, you need to adjust the service application timeout. Otherwise, the service application will kill the debugger within 20 seconds after starting. Adjusting the timeout involves setting an entry in the following registry key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control


Under this key, create a DWORD data value called ServicesPipeTimeout. Set this entry to the amount of time in milliseconds that you want the service to wait before timing out. For example, 60,000 is one minute, while 86,400,000 is 24 hours.

设置ServicesPipeTimeout后需要重启系统才生效

Now, when the service is started, the debugger will also start. When the debugger starts, it will stop at the initial process breakpoint, before the service has begun running. This allows you to set breakpoints or otherwise configure your debugging session to let you monitor the startup of your service. Another option is to place calls to the DebugBreak function in your service from the point at which you would like to break into the debugger. (For more information, see DebugBreak in the Platform SDK documentation.)

If your service is running with other services in a Service Host Process, you may need to isolate the service into its own Service Host Process.
rlzlnet 2018-10-09
  • 打赏
  • 举报
回复
_wfopen_s我用过flush 可是socket里面好像没有强制刷新缓冲区这个概念啊,我客户端和服务端都是用C++写的。 服务端是非阻塞方式,recv每次一个buff,不一定是一个包的长度,最后会填充完整个包。 客户端是阻塞模式。 我关了防火墙和uac权限。
不二星空 2018-10-09
  • 打赏
  • 举报
回复
不然你可以使用wireshark抓包看看,包的发送情况
不二星空 2018-10-09
  • 打赏
  • 举报
回复
可以考虑将防火墙功能都关闭掉,试试。个人理解:作为服务启动应该没有特别的运行区别,主要还是权限,运行的用户组、防火墙之类的。
@风轻云淡_ 2018-10-09
  • 打赏
  • 举报
回复
socket flush() 那你看一下是不是这个的问题。具体资料网上一大堆,我就不复制了。
rlzlnet 2018-10-09
  • 打赏
  • 举报
回复
是纯的socket架设的tcp,没有http协议成分在里面,也不存在客户端主动请求get或者post或其它 1.都在我本机上。 2.服务端可以检测到客户端accept,一旦新连接建立服务端主动send一个消息过去,这个消息客户端可以检测到。 3.客户端收到消息后返回去send,服务端收不到
@风轻云淡_ 2018-10-09
  • 打赏
  • 举报
回复
还有一定要检查防火墙是否开启或者允许接受数据。
@风轻云淡_ 2018-10-09
  • 打赏
  • 举报
回复
你先在客户端ping一下服务端,检测下网络是否双向是联通的。再一个是不是服务端端口被占用了,检查下有没别的程序也在监听这个端口,或者直接换个端口。用浏览器发送一个简单的get请求看看是否有回应。
rlzlnet 2018-10-09
  • 打赏
  • 举报
回复
我也以为是没开,后来用netstat 检测到端口是开启状态,和一般应用启动是一样的。 最悲催的是服务端收不到客户端发的消息,客户端的确发了。 客户端和服务端通信机制是客户端一旦连上,服务端会发送一个随机明文要求被加密成密文返回,以验证是否自己的客户程序。 客户端可以收到服务器发来的数据,但回传没一点消息,过段时间就显示被服务端心跳超时给踢了。 用测试软件模拟客户端也是这样。 socket肯定没问题,已经被成功开启,不然客户端不可能收到要求注册的消息。 程序估计也没问题,因为以应用方式启动没有任何异常,唯独服务模式,似乎没有同意什么东西,一直不让连接上
@风轻云淡_ 2018-10-09
  • 打赏
  • 举报
回复
是不是注册到服务模式的时候,监听的端口没打开?你监听的端口是常用端口吗。
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器,服务器与服务器之间使用socket通信。还可以使用c++客户做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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