RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [其他] [原創][分享]分享一個更換PPPoE IP的程式,含 Perl 原始碼分享   字型大小:||| 
charleshwu
鐵驢友〔初級〕
等級: 4


今日心情

 . 積分: 24
 . 文章: 43
 . 收花: 161 支
 . 送花: 16 支
 . 比例: 0.1
 . 在線: 239 小時
 . 瀏覽: 6683 頁
 . 註冊: 4445
 . 失蹤: 18
#1 : 2017-10-9 06:26 PM     只看本作者 引言回覆

有跟我一樣有在下載免空的朋友嗎?也許你會跟我一樣常常遇到頻寬限制,這時就會需要換一個 IP 了。

假如你也是跟我一樣用 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;
                }
                       
                if (++$nLoopCnt>10) {
                        print "Giveup\n";
                        last;
                }
                print "Redial #$nLoopCnt...\n";
        }       
        $hDB_IP_Time{$stIP}=$nTime_;
        print "Done\n";
}

print "Checking...\n";
my $stIp_=CheckIPWithProxy($oLWP_,'');
#print "IP=>".$stIp_."\n";
ChangeIP($oLWP_,$stIp_);
exit;

換 IP 的批次檔 DoRedial.bat ====
@Echo Off
rasdial.exe seednet /DISCONNECT
rasdial.exe seednet seednet seednet


 附件: 您所在的用戶組無法下載或查看附件


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2017-12-17 05:50 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.024004 second(s), 7 queries , Qzip disabled