一个小问题,网络的,我需要程序代码,在下菜鸟。(30分)

  • 主题发起人 主题发起人 hylwr
  • 开始时间 开始时间
H

hylwr

Unregistered / Unconfirmed
GUEST, unregistred user!
就是定时间ping一台机器,用途如下:
以下转摘:
------
拨接用户最讨厌的事情大概是网路无缘无故自动断线!大多数的ISP为了顾及大多数人的使用权益,都会设定自动断线,如果用户连续20分钟没有传递任何资料,就会自动断线,以免浪费有限的频宽。
WakeUp是个很简单的免费小软体,他唯一的功能就是维持网路连线。WakeUp每隔120秒会自动传送封包〈Packets〉到ISP的伺服器,以免ISP以为你在浪费网路频宽而自动断线。至於传送封包的间隔时间也可以调整,每30-3600秒传送一次。--------
在下需要原程序,可能就是一句话。
 
源程序在此:-)
ping -t 209.143.154.82


 
我以前写过一个定时PING的小程序,用ICMP.DLL.定时容易,发送ICMP包稍麻烦点,
是用BCB写的,不知你的意思是不是定时PING一些IP.
 
cAKK的方法怎么控制时间呢?
我是这样写的,不知你对TCP/IP熟不熟,需要用到ICMP,我有两个ICMP的头文件.
有感兴趣的我可以发MAIL或贴出来(有点长);
下面的代码你可以改为DELPHI的,需要LoadLibrary("ICMP.DLL"),函数声明如下:
HANDLE __stdcall(*IcmpCreateFile)(void);
bool __stdcall (*IcmpCloseHandle)(HANDLE IcmpHandle );
DWORD __stdcall (*IcmpSendEcho)(
HANDLE IcmpHandle,
IPAddr DestinationAddress,
LPVOID RequestData,
WORD RequestSize,
PIP_OPTION_INFORMATION RequestOptions,
LPVOID ReplyBuffer,
DWORD ReplySize,
DWORD Timeout
);

TStrings* __fastcall TMainFrm::PingTest(TStrings *IPStrings) // daizhengli
{
PIP_OPTION_INFORMATION IPOpt; //IpOption
PICMP_ECHO_REPLY PIPecho;
PChar pReqData,pRevData;
DWORD FIPAddress;
DWORD FSize;
DWORD FTimeOut;
DWORD FBufsize;
AnsiString MyString;
int i,j;
LPVOID lpMsgBuf;
AnsiString ErroMsg;

FSize = 40;
FBufsize = sizeof(ICMP_ECHO_REPLY) + FSize;

PingMemo->Lines->Clear();

PIPecho = (PICMP_ECHO_REPLY)AllocMem(FBufsize); //Remeber del
IPOpt = (PIP_OPTION_INFORMATION)AllocMem(sizeof(IP_OPTION_INFORMATION));//rem del

pRevData = new char[FSize];
PIPecho->Data = pRevData;
FTimeOut = 4000;
MyString = StrEdit->Text;
pReqData = MyString.c_str();
//memset(&IPOpt,'0',sizeof(IP_OPTION_INFORMATION));
IPOpt->Ttl = 32;
for(i=0;i<IPStrings->Count;i++)
{
ifError = false;
MyErrorFlag = 0;
FIPAddress = inet_addr((IPStrings->Strings).c_str());
PingMemo->Lines->Add(IPStrings->Strings);
try
{
for(j=0;j<3;j++)
{
CurrTime = TDateTime::CurrentDateTime();
if(IcmpSendEcho(hIcmp, FIPAddress, pReqData, MyString.Length(), IPOpt, PIPecho, FBufsize, FTimeOut)!=0)
{
PingMemo->Lines->Add(IntToStr((*PIPecho).DataSize)+" "+IntToStr((*PIPecho).RoundTripTime)+"/t"+AnsiString((*PIPecho).Options.Ttl)+" "+IntToStr((*PIPecho).Status)+" "+CurrTime.DateTimeString());
if((*PIPecho).Status!=IP_SUCCESS)
{
MyErrorFlag++;
MyErrorCode = (*PIPecho).Status;
}
}
else
{

int k = (*PIPecho).Status-IP_STATUS_BASE;
PingMemo->Lines->Add("IP地址未知或错误: "+ErrorStr[k-1]+CurrTime.DateTimeString());
ifError = true;
break;
}
}
if(MyErrorFlag>2)
HandleError(MyErrorCode);
else if(!ifError)
PingMemo->Lines->Add("状态正常");
}
catch(...)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION);
SetLastError(0);
PingMemo->Lines->Add((LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf );
IcmpCloseHandle(hIcmp);
SysFreeMem(PIPecho);
SysFreeMem(IPOpt);
delete pRevData;
break;
}

} //End for(ip)

SysFreeMem(PIPecho);
SysFreeMem(IPOpt);
delete pRevData;
return(PingMemo->Lines);
}
 
timer1ontimer(Sender: TObject);
begin
timer1.active:=false;
shellexecute(handle,'open','ping 202.96.0.133',nil,nil,sw_hide);
timer1.active:=true;
end;
 
>>维持网路连线
为什么一定要设置时间??
 
他要定时PING啊
 
呵呵, 我的方法简单+保险:-)
用timer控制时间就可以了.
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部