假如你也是跟我一樣用 PPPOE 連線,你可以寫一個批次檔來呼叫 rasphone 或 rasdial 來重新連線,但有時候你會拿到跟剛剛一樣的 IP,在斷線與連線之間插入一些約幾十秒的等待可以降低 IP 一樣的機率,但這樣會需要多花時間。
這裡分享一個自己寫的更換 IP 程式,它會檢查目前的 IP,然後呼叫更換 IP 的批次檔,然後再檢查一次IP,直到這個 IP 是新的,或是已經好一段時間沒用過。
純心得分享,所以附上所有原始碼,歡迎有需要的朋友自行取用。
****記得使用前要修改一下 DoRedial.bat 的內容以配合你的 PPPoE 設定
主程式 : Redial_NewIP_V0.1.pl ====
#!/usr/bin/perl
use strict;
use LWP;
use DB_File;
$|=1;
my $nTime_=time();
my $nOldEnough_=7200;
my %hDB_IP_Time;
my $stIP_Time='IP_Time.DB';
tie(%hDB_IP_Time, 'DB_File', $stIP_Time)
or die "Can't tie $stIP_Time: $!";
use LWP::UserAgent;
my $oLWP_=LWP::UserAgent->new(agent => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
sub HttpGetWithProxy{
my ($oLWP,$stURL,$stProxy)=@_;
#print Dumper([($oLWP,$stURL,$stProxy)]);
#$oLWP->no_proxy();
$oLWP->proxy('http',$stProxy?$stProxy:"");
my $oResponse=$oLWP->get($stURL);
return $oResponse->is_success?$oResponse->content:undef
}
sub CheckIPWithProxy{
my ($oLWP,$stProxy)=@_;
my $stURL_="http://checkip.dyndns.org/";
my $stWebIPCheck=HttpGetWithProxy($oLWP,$stURL_,$stProxy);
my ($stIPAddr)=$stWebIPCheck=~/^<html><head><title>Current IP Check<\/title><\/head><body>Current IP Address: ([0-9.]+)/;
return $stIPAddr;
}
sub ChangeIP {
my ($oLWP,$stIP)=@_;
print "Old IP=>$stIP\n";
my $iIpAge;
$hDB_IP_Time{$stIP}=$nTime_;
my $stCmdChgIP='cmd /c DoRedial.bat';
my $stProxy='';
my $nLoopCnt=0;
while (1) {
system($stCmdChgIP);
$stIP=CheckIPWithProxy($oLWP,$stProxy);
print "Now IP=>".$stIP."\n";
if (!exists($hDB_IP_Time{$stIP})) {
print "New IP.\n";
last;
}
$iIpAge=$nTime_-$hDB_IP_Time{$stIP};
print "IP Age=$iIpAge\n";
if ($iIpAge>$nOldEnough_) {
last;
}