09-07-2012, 17:47
|
|
מנהל פורום מערכות הפעלה - הרובע המייקרוסופטי.
|
|
חבר מתאריך: 07.10.04
הודעות: 13,777
|
|
עוד אחד - ביצוע ping ל tcp port
בהמשך לסקריפט מלמעלה - ביצוע tcp-ping
עלה צורך אצלנו לברר לגבי כל אחד מחוות השרתים שלנו מול איזו מדינה הם מתקשרים הכי מהר לשם העלאת שירות גולבאלי.
הפתרון (שאני חשבתי עליו) - ביצוע ping לפורט 80 לאתרים מקומיים במדינות השונות והשוואת התוצאות,
השאלה - איך מבצעים ping לפורט ויותר מזה - איך מודדים את זה?
הפתרון: port-ping
קוד:
function port-ping
{
Param([string]$srv,$port=80,$timeout=3000,[switch]$verbose)
$ErrorActionPreference = "SilentlyContinue"
$blaaa = measure-command
{
$tcpclient = new-Object system.Net.Sockets.TcpClient
$iar = $tcpclient.BeginConnect($srv,$port,$null,$null)
$wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false)
if(!$wait)
{
$tcpclient.Close()
if($verbose){Write-Host "Connection Timeout"}
Return $false
}
else
{
$error.Clear()
$tcpclient.EndConnect($iar) | out-Null
if(!$?){if($verbose){write-host $error[0]};$failed = $true}
$tcpclient.Close()
}
}
if($failed){return $false}else{return $blaaa.TotalMilliseconds}
}
אז מה זה בעצם עושה?
הפונקציה port-ping מקבלת עד 4 פרמטרים, הראשון - לאיפה לבצע פינג, השני - לאיזה פורט (ברירת מחדל - 80), השלישי - כמה זמן לחכות לtimeout (ברירת מחדל - 3 שניות) והרביעי - פלט "מפורט" (ברירת מחדל - ללא)
קוד:
Param([string]$srv,$port=80,$timeout=3000,[switch]$verbose)
במקרה של שגיאה - ממשיכים בלי לעצור את התוכנית(תפירה מיוחדת לצרכים שלי) ומתחילים למדוד זמן ריצה של סט פקודות
קוד:
$ErrorActionPreference = "SilentlyContinue"
$blaaa = measure-command
יצירת אובייקט מתאים + פתיחה של connection מסוג TCP ליעד + הגדרה של timeout
קוד:
$tcpclient = new-Object system.Net.Sockets.TcpClient
$iar = $tcpclient.BeginConnect($srv,$port,$null,$null)
כמעט סיימנו: כל-עוד לא עבר ה timeout לבדוק אם נפתח ה connection
אם כן - סגירת הconnection, אם לא - העלאת שגיאה
קוד:
$wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false)
if(!$wait)
{
$tcpclient.Close()
if($verbose){Write-Host "Connection Timeout"}
Return $false
}
else
{
$error.Clear()
$tcpclient.EndConnect($iar) | out-Null
if(!$?){if($verbose){write-host $error[0]};$failed = $true}
$tcpclient.Close()
}
ולסיום - החזרת שגיאה או משך הזמן שלקח לפתיחת הconnection
קוד:
if($failed){return $false}else{return $blaaa.TotalMilliseconds}
דוגמה לשימוש בפונקצייה:
החזרת משך הזמן שייקח למחשב לפתוח חיבור לאתר מייקרוסופט
קוד:
port-ping www.microsoft.com -port 80
החזרת 5 בדיקות שונות למשך הזמן שייקח למחשב לפתוך חיבור לאתר מייקרוסופט וכן לאתר nba
קוד:
1..5 | % {write-output "test $_"; "www.microsoft.com","www.nba.com" | % {port-ping $_ -port 80}}
החזרת 3 בדיקות למשך הזמן שייקח למחשב לפתוח חיבור לרשימת אתרים שמופיעים בקובץ והוצאת הפלט לקובץ:
קוד:
1..5 | % {write-output "test $_"; type sites.txt | % {port-ping $_ -port 80}} | out-file test.txt
_____________________________________
|