📄 cb199910nt0602_f.asp.htm
字号:
<p class=Code><span class=Code> <b> int</b>
IPAddress; </span></p>
<p class=Code><span class=Code> <b> bool</b>
Ping();</span></p>
<p class=Code><span class=Code> <b> void</b>
SendMail(<b>bool</b> ServerUp); </span></p>
<p class=Code><span class=Code> <b> public</b>:</span></p>
<p class=Code><span class=Code> String IPString; </span></p>
<p class=Code><span class=Code> String EMailToAddress; </span></p>
<p class=Code><span class=Code> String EMailFromAddress; </span></p>
<p class=Code><span class=Code> String EMailHostAddress; </span></p>
<p class=Code><span class=Code> <b> bool</b>
LogError; </span></p>
<p class=Code><span class=Code> <b> int</b>
PingInterval; </span></p>
<p class=Code><span class=Code> <b> void</b>
MakeIPAddress();</span></p>
<p class=Code><span class=Code> <b> virtual</b>
<b>__fastcall</b> <b>void</b> Execute();</span></p>
<p class=Code><span class=Code> <b> __fastcall</b>
TPingThread(<b>bool</b> CreateSuspended); </span></p>
<p class=Code><span class=Code>};</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#endif</span></span></p>
<p class=Captions><b>Figure
10:</b> The header for
the <i>TPingThread</i> class. </p>
<p class=BodyText> </p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
<vcl.h> </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#pragma
hdrstop</span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>extern</b>
"C" {</span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
"ipexport.h"" </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
"icmpapi.h" </span></span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
"PingThreadU.h" </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
"PingServiceU.h" </span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#pragma
package(smart_init) </span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>const</b>
<b>char</b>* statusMsg = "The server
at %s is %s"; </span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>__fastcall</b>
TPingThread::TPingThread(<b>bool</b> CreateSuspended) </span></p>
<p class=Code><span class=Code> : TThread(CreateSuspended) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> LogError = <b>true</b>;</span></p>
<p class=Code><span class=Code> PingInterval = 5000; </span></p>
<p class=Code><span class=Code> IPAddress = -1; </span></p>
<p class=Code><span class=Code> ServerDownReported = <b>false</b>;</span></p>
<p class=Code><span class=Code> FreeOnTerminate = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b> TPingThread::Execute()</span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> <b> while</b>
(!Terminated) {</span></p>
<p class=Code><span class=Code> Sleep(PingInterval); </span></p>
<p class=Code><span class=Code> <b
style='mso-bidi-font-weight:normal'>if</b> (IPString != "") {</span></p>
<p class=Code><span class=Code> <b> bool</b>
goodPing = Ping();</span></p>
<p class=Code><span class=Code> <b> if</b>
(!goodPing && !ServerDownReported) {</span></p>
<p class=Code><span class=Code> <b> if</b>
(LogError) {</span></p>
<p class=Code><span class=Code> String Msg = String().sprintf(</span></p>
<p class=Code><span class=Code> statusMsg, IPString.c_str(),
"down."); </span></p>
<p class=Code><span class=Code> BCB4UnlPing->LogMessage(</span></p>
<p class=Code><span class=Code> Msg, EVENTLOG_INFORMATION_TYPE, 0, 0); </span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> <b> else</b></span></p>
<p class=Code><span class=Code> SendMail(<b>false</b>);</span></p>
<p class=Code><span class=Code> ServerDownReported = <b
style='mso-bidi-font-weight:normal'>true</b>;</span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> <b> if</b>
(goodPing && ServerDownReported) {</span></p>
<p class=Code><span class=Code> ServerDownReported = <b
style='mso-bidi-font-weight:normal'>false</b>;</span></p>
<p class=Code><span class=Code> <b> if</b>
(LogError) {</span></p>
<p class=Code><span class=Code> String Msg = String().sprintf(</span></p>
<p class=Code><span class=Code> statusMsg, IPString.c_str(),
"up."); </span></p>
<p class=Code><span class=Code> BCB4UnlPing->LogMessage(</span></p>
<p class=Code><span class=Code> Msg, EVENTLOG_INFORMATION_TYPE, 0,
0); </span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> <b> else</b></span></p>
<p class=Code><span class=Code> SendMail(<b>true</b>);</span></p>
<p class=Code><span class=Code> }<$I~services;interactive><$I~interactive services;(Windows
NT)><$I~Windows NT;services;interactive> </span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> }<$I~TPingThread Class (listing
6.8)><$I~listings;TPingThread Class><$I~PingService program
example><$I~Windows NT;services;PingService program example> </span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>bool</b>
TPingThread::Ping()</span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> <b
style='mso-bidi-font-weight:normal'>bool</b> result = <b>true</b>;</span></p>
<p class=Code><span class=Code> HANDLE hIcmp = IcmpCreateFile();</span></p>
<p class=Code><span class=Code> <b> if</b>
(!hIcmp) {</span></p>
<p class=Code><span class=Code> BCB4UnlPing->LogMessage("Unable to
load ICMP.DLL. The " </span></p>
<p class=Code><span class=Code> "service is terminating.",
EVENTLOG_ERROR_TYPE, 0, 0); </span></p>
<p class=Code><span class=Code> Terminate();</span></p>
<p class=Code><span class=Code> <b> return</b>
<b>false</b>;</span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> <b> int</b>
size = <b>sizeof</b>(icmp_echo_reply) + 8; </span></p>
<p class=Code><span class=Code> <b> char</b>*
buff = <b>new</b> <b>char</b>[size]; </span></p>
<p class=Code><span class=Code> DWORD res = IcmpSendEcho(</span></p>
<p class=Code><span class=Code> hIcmp, IPAddress, 0, 0, 0, buff, size,
1000); </span></p>
<p class=Code><span class=Code> <b> if</b>
(!res) </span></p>
<p class=Code><span class=Code> <i> <span Class=CodeBlue>// timed out</span></i></span></p>
<p class=Code><span class=Code> result = <b>false</b>;</span></p>
<p class=Code><span class=Code> <b> else</b>
{</span></p>
<p class=Code><span class=Code> icmp_echo_reply reply; </span></p>
<p class=Code><span class=Code> memcpy(&reply, buff, <b
style='mso-bidi-font-weight:normal'>sizeof</b>(reply)); </span></p>
<p class=Code><span class=Code> <b
style='mso-bidi-font-weight:normal'>delete</b>[] buff; </span></p>
<p class=Code><span class=Code> <b> if</b>
(reply.Status> 0) </span></p>
<p class=Code><span class=Code> <i> <span Class=CodeBlue>// error</span></i></span></p>
<p class=Code><span class=Code> result = <b>false</b>;</span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> IcmpCloseHandle(hIcmp); </span></p>
<p class=Code><span class=Code> <b> return</b>
result; </span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b>
TPingThread::SendMail(<b>bool</b> ServerUp) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> TNMSMTP* SMTP = <b>new</b> TNMSMTP(0); </span></p>
<p class=Code><span class=Code> <b> try</b>
{</span></p>
<p class=Code><span class=Code> SMTP->PostMessage->FromName =
"BCB 4 Unleashed Ping Service"; </span></p>
<p class=Code><span class=Code> SMTP->PostMessage->ToAddress->Add(EMailToAddress); </span></p>
<p class=Code><span class=Code> SMTP->PostMessage->FromAddress =
EMailFromAddress; </span></p>
<p class=Code><span class=Code> SMTP->Host = EMailHostAddress; </span></p>
<p class=Code><span class=Code> SMTP->PostMessage->Subject =
"Server Alert"; </span></p>
<p class=Code><span class=Code> String Msg; </span></p>
<p class=Code><span class=Code> <b> if</b>
(ServerUp) </span></p>
<p class=Code><span class=Code> Msg.sprintf(statusMsg, IPString.c_str(), "up."); </span></p>
<p class=Code><span class=Code> <b> else</b></span></p>
<p class=Code><span class=Code> Msg.sprintf(statusMsg, IPString.c_str(),
"down."); </span></p>
<p class=Code><span class=Code> SMTP->PostMessage->Body->Add(Msg); </span></p>
<p class=Code><span class=Code> SMTP->Connect();</span></p>
<p class=Code><span class=Code> SMTP->SendMail();</span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code> <b> catch</b>
(Exception& E) {</span></p>
<p class=Code><span class=Code> BCB4UnlPing->LogMessage("Unable to
send e-mail: " +</span></p>
<p class=Code><span class=Code> E.Message, EVENTLOG_ERROR_TYPE, 0,
0);<$I~services;interactive><$I~interactive services;(Windows
NT)><$I~Windows NT;services;interactive> </span></p>
<p class=Code><span class=Code> <b> delete</b>
SMTP;<$I~TPingThread Class (listing 6.8)><$I~listings;TPingThread
Class><$I~PingService program example><$I~Windows
NT;services;PingService program example> </span></p>
<p class=Code><span class=Code> &nb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -