主页
Top.Mail.Ru Yandeks.Metrika
论坛:“系统”;
当前存档:2002.10.10;
下载:[xml.tar.bz2];

向下

神秘的服务 找到类似的分支


Wazowski   (2002-07-29 16:49) [0]

我编写了一项服务,用于将UDP数据包从一台机器发送到另一台机器,但感到十分痛苦。 一种路由器。 只是他表现得很神秘。 如果有人将包裹传递给-一切正常。 如果没有人要接收该数据包(例如,目标计算机已关闭或类似的操作),则会在写入流时出错,并被削减。 但是,这不是最有趣的事情。 我以前遇到过此问题,无法以我在常规程序中滚动的方式解决。 好了,即使您突发了,ProcessMessages过程也不支持该服务。 所以在这里。 失败后,服务崩溃,但服务管理控制台显示一切正常-您的服务正在运行。 只有在手动重新启动服务后,才能修复所有问题。 (我试图更改服务的设置-它不想在出现错误后重新启动。看来Windows甚至都不“知道”该服务已失败并且不再起作用)。 尽可能提供帮助。 您所需要的只是捕捉写入流中的错误。



Fiend   (2002-07-30 09:57) [1]

很可惜,当我有必要回家时已经看到了你的问题,但是今天我想起并决定回答,也许你会读。

第一个问题:为什么需要ProcessMessages。 我相信你可以做到。 我有一个复杂的多线程服务。 因此,尽管它是编写和调试时的简单应用程序,但我确实在主线程的某些位置使用了ProcessMessages。 但是,当我将其重新提供给服务时,这种需求本身就消失了。 我这样做是:在OnExecute上运行的主服务线程仅包含一行 CRService.ServiceThread.ProcessRequests(true);,即 主线程只是挂起并等待系统消息(陷波,停止,重新启动)。 这样,我的线程将始终能够结束和启动。

第二个问题:您如何允许自己启动一项从根本上能够压倒系统的服务? 如果未调试为零,它是系统进程吗? 当然,有必要将所有内容回滚到常规应用程序上。

第三:为什么要考虑发生事故时重启服务的基本原则? 您可能已经在Microsoft看到了足够的信息? 在MS SQL Server中? 如果是,那么不要忘记存在一个稍微不同的机制。 在那里,该服务不会在发生事故时重新启动自身,但是有一个服务器代理,它也是一种服务,如果服务器出现故障,它将重新启动它。

用最好的!



Wazowski   (2002-07-31 12:26) [2]

所有这些都很好,但是没有帮助:-(
当服务安静地死亡时,它也会死亡。 有一个有趣的效果。 路由器似乎接收到了数据包(失败后),因为客户端程序报告发送成功,但没有进一步传输它们。 这是完全神秘的-当您尝试“手动”从MMC重新启动服务时,它突然“变为现实”,并且在停止之前,它会抛出网络上收到的最后一个数据包。 即 他实际上接收了数据包,但不想发送它们。 听起来很傻,但是确实如此。 还有一个小问题。 为什么不起作用“ 试试......除外“。即使此服务是一个简单的应用程序,该设计也无法正常工作。



Digitman   (2002-07-31 13:24) [3]

try ... except块根本不需要按照您期望的方式工作,无论您将其“粘贴”在哪里

举例说明该块不起作用的情况



Fiend   (2002-07-31 17:08) [4]

那个沃佐夫斯基

完全同意Digitman的尝试,除非。
当此阻止“没有起作用”时,我也遇到了服务问题。 但是后来发现,这个错误根本不是在他内部发生的,而是在他之后,完全无害的。 就我而言,这是同步,通过Digitman参与了我在该问题上的讨论。 事实证明,当收到有关停止服务的消息时,子线程没有时间停止(尽管我已尽一切努力完成该工作),并且我已经卸载了它们使用的资源。 这是在尝试除块之后发生的,并且混乱到足以误导我。 最后,我使用了我最喜欢的BEEP函数来调试停止服务的过程。 只是愚蠢地把它放到一个地方,然后停了好几次仔细听着说话的人,然后又停了下来。 由于两天的听觉和精神压力,我注意到发生了什么。

最后:您很难做些什么,因为您自己可能会明白何时看不到源代码。 肥皂,也许有我的帮助。 我保证不出售和捐赠源,而是在观看后销毁它。 :))))

用最好的!



Digitman   (2002-07-31 17:31) [5]

>致作者

我对代码犹豫不决-立即陷入“麻烦”之中)
主持人知道他们的工作!)做得好!



Wazowski   (2002-08-01 11:39) [6]

出于普遍需求,我发布了代码:
过程TUDPProxy.ProxyAction(RemAddr:String; ActionString:String; Sender:TObject); 变种 MyStream:TMemoryStream; TmpStr:字符串; 开始 NMUDP1.ReportLevel:= Status_Basic; NMUDP1.RemoteHost:= RemAddr; NMUDP1.RemotePort:= 6767; TmpStr:= ActionString; MyStream:= TMemoryStream.Create; 试一试 MyStream.Write(TmpStr [1],长度(TmpStr)); *! NMUDP1.SendStream(MyStream); 除了 在EWriteError上 开始 MyStream.Free; 结束 否则MyStream.Free; 结束 NMUDP1.RemotePort:= 7000; 结束 过程TUDPProxy.NMUDP1DataReceived(发送方:TComponent; NumberBytes:整数; FromIP:字符串; 端口:整数); 变种 MyStream:TMemoryStream; TmpStr:字符串; 开始 MyStream:= TMemoryStream.Create; 试一试 NMUDP1.ReadStream(MyStream); SetLength(TmpStr,NumberBytes); MyStream.Read(TmpStr [1],NumberBytes); 终于 MyStream.Free; SenderIP:= FromIP; 结束 睡眠(200); 试一试 ProxyAction(GetAddr(TmpStr),GetMessage(TmpStr),nil); 终于 {为用户提供了一个信号代码,但在提供服务的情况下,他失去了价值} 结束 结束

这是我从一个程序中转移过来的两个主要过程,几乎不变。 相反,它只是应用程序形式的服务原型。 所有这些都在2000个月的Win5 Server上成功运行。 那里提到了另外两个函数,但是它们的名字说明了一切。 这些只是使用字符串的功能,因此我没有在此处上传它们。
在标记为“!”的行中观察到该错误!*!在“客户端的另一端”没有客户端程序接收器的情况下。 写入流时发生错误。
我很高兴听到任何建议,并忍受任何批评:)



Digitman   (2002-08-01 15:01) [7]

我怀疑问题是相同的,这引发了许多有关TClientSocket / TServerSocket的问题:对异步模式下套接字功能的误解。

由于缺少原始文本(这是一个原则),我本人从未使用过FastNet的组件(特别是NMUDP),但是我倾向于以足够的把握来假设由NMUDP对象控制的套接字的操作模式是完全异步的。 这意味着除嵌入了send方法的try ..之外,其他任何方法都无法按您的预期工作。 嵌套的传输事件是异步发生的,并且要“捕获”它们(包括在1队列中-记录传输通道由于某种原因失败的事件)应该在NMUDP对象的相应事件中,而不是在外观上在上面的代码中。

目前尚不清楚为什么在except块中必须更改端口号:异常可以是任何异常,包括 与运输无关。 顺便说一句,我记得EWriteError根本没有与传输连接:您永远不知道为什么无法将数据写入流中……流本身就是一个流..它如何与嵌套传输连接?



Waxowski   (2002-08-02 11:46) [8]

我要感谢所有响应我的呼吁的人。
我要特别感谢Fiend,他实际上提出了解决问题的办法。
和以前一样,由于NMUDP仍在尝试将数据包发送到一个没人接收的地址,并且该程序已经破坏了发送流,因此发生了错误,因此我们在轮询服务和发送状态时插入了一个小的延迟,然后一切就绪代替它。
最令人讨厌的是,对于Delphi中我的需求示例,所有这些过程都进行了少许修改。 当然,它们中有可见性,但实际上,如您所见,它们实际上都是潮湿的。
好吧,是的,他们从错误中学习。
再次感谢大家。



Wazowski   (2002-08-02 11:53) [9]

>> Digitman
只是在这里运输,与它无关。 如您所知,UDP协议(不同于TCP)在不确认数据包传送的情况下工作,这就是我使用它的原因。 错误是在TStream级别上准确发生的事实,是我立即计算出的结果。 但是后来,我对在Win95 \ 98 \ Me下该代码有效,但在Win2000下工作的事实感到困惑-不。



Digitman   (2002-08-02 12:10) [10]

>沃佐夫斯基

好吧,这就是我说的:问题恰恰在于套接字本身的异步操作模式的特征,而不是套接字的SOCK_STREAM和SOCK_DGRAM模式的传输差异。 一切都收敛了–您启动了异步操作,并且无需等待其最终结果(无需分析报告操作成功或失败的事件),就可以破坏此异步操作的操作所依赖的资源(在这种情况下为TStream)。



Wazowski   (2002-08-02 12:20) [11]

>> Digitman
那是肯定的!
我只是被卡住了一个事实,那就是在传输过程中不会出现错误,发送了数据包,然后我们不在乎它有什么问题。 但这值得等待。
都是一样的,我不清楚为什么在千禧年​​中一切都可以工作? 也许我很愚蠢,或者什么都不懂?



Fiend   (2002-08-02 12:42) [12]

那个沃佐夫斯基

比利是罪魁祸首!

我的同志 在VC ++上有一个程序,因此在NT 4和螺栓W95,W98下都能正常工作。 他们没有做当前的事...
他们甚至在Windows 98下重新编译了它,但仍然是一个螺栓,一个螺栓就掉了:)))))))))



Digitman   (2002-08-02 13:33) [13]

>沃佐夫斯基

我认为这是因为Winsock规范代码中的实现方式不同。

在异步模式下,您应仅依赖事件和正确的处理(根据Winsock规范)。 或者-不使用异步模式,而是使用同步模式,将逻辑转移到其他流



Страницы: 1 整个分支

论坛:“系统”;
当前存档:2002.10.10;
下载:[xml.tar.bz2];

楼上









内存:0.63 MB
时间:0.031 c
1-31886年
vixic
2002-09-30 10:12
2002.10.10
命令行


14-31988年
LStranger
2002-09-16 15:11
2002.10.10
而在基辅现在总统的进攻


14-32002年
EAlexander
2002-09-17 10:21
2002.10.10
需要ExpressSpreadSheet :))


1-31777年
VladP
2002-09-30 10:24
2002.10.10
TCollectionDescendant.Add


1-31800年
k
2002-10-01 17:19
2002.10.10
bb





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский