Code: Select all
function Multicast-Listen([int]$Port, [string]$IPMCastAddress, [string]$IPLocalAddress, [string]$INI_file, [string]$ConnectorName) {
#First create the multicast socket.
$mCastSocket = New-Object System.Net.Sockets.Socket([System.Net.Sockets.AddressFamily]::InterNetwork, [System.Net.Sockets.SocketType]::Dgram, [System.Net.Sockets.ProtocolType]::Udp)
#Now create the local endpoint using the address and port passed in.
$locEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse($IPLocalAddress), $Port)
#Create the remote endpoint (any)
$remEndPoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([Net.IPAddress]::Any), 0)
#I'm not sure why, but if you don't cast this to an EndPoint object, it won't work
$remEndPoint = [System.Net.EndPoint]$remEndPoint
#Define our MulticastOption object (mcast address etc.)
$mCastOption = New-Object System.Net.Sockets.MulticastOption([System.Net.IPAddress]::Parse($IPMCastAddress), [System.Net.IPAddress]::Parse($IPLocalAddress))
$mCastSocket.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::Socket, [System.Net.Sockets.SocketOptionName]::ReuseAddress, $true)
$mCastSocket.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::IP, [System.Net.Sockets.SocketOptionName]::AddMembership, $mCastOption)
#Bind the socket to the endpoint.
$mCastSocket.Bind($locEndPoint)
$mCastSocket.ReceiveTimeout = 20000
#We need an array of bytes.
[byte[]]$bytes = 0 .. 255 | %{ 0 }
$enc = New-Object System.Text.ASCIIEncoding
$receivedBytes = $mCastSocket.ReceiveFrom($bytes, [ref]$remEndPoint)
$str = $enc.GetString($bytes, 0, $receivedBytes)
$mCastSocket.ReceiveTimeout
# add output to an array
$mdump_Object = New-Object System.Object
$mdump_Object | Add-Member -type NoteProperty -name ComputerName -Value $env:computername
$mdump_Object | Add-Member -type NoteProperty -name Soruce -Value $IPMCastAddress
$mdump_Object | Add-Member -type NoteProperty -name Port -Value $port
$mdump_Object | Add-Member -type NoteProperty -name Interface -Value $IPLocalAddress
$mdump_Object | Add-Member -type NoteProperty -name Multicast -Value $remEndPoint.ToString()
$mdump_Object | Add-Member -type NoteProperty -name INI_file -Value $INI_file
$mdump_Object | Add-Member -type NoteProperty -name ConnectorName -Value $ConnectorName
#Write to log file.
Write-Log -Message "Waiting for a connection on $IPMCastAddress $port $IPLocalAddress"
if ($mdump_Object.Multicast -eq '0.0.0.0:0') {
$mdump_Object | Add-Member -type NoteProperty -name Status -Value "Failed"
Write-Log -Message "Didnt Received multicast from $($remEndPoint.ToString()) $($str)" -Level Error
}
else {
Write-Log -Message "Received multicast from $($remEndPoint.ToString()) $($str)"
Write-Log -Message "Connection closed."
$mdump_Object | Add-Member -type NoteProperty -name Status -Value "Passed"
}
return $mdump_Object
}
$multiCastLines = Get-SMDiniContent
workflow MultiCast-Workflow {
parallel {
ForEach -Parallel ($multiCastLine in $multiCastLines) {
# The commands run in parallel on each connection.
$multicast_run = Multicast-Listen -IPMCastAddress $multiCastLine.Soruce -Port $multiCastLine.Port -IPLocalAddress $multiCastLine.interface -INI_file $multiCastLine.INI_file -ConnectorName $multiCastLine.ConnectorName
$WORKFLOW:test += $multicast_run
#$all_Data_Failed_Passed += $multicast_run
}
[array]$all_Data_Failed_Passed = @($test)
}
}
$all_Data_Failed_Passed | Export-Csv "C:\$($env:computername).csv" -notype
MultiCast-Workflow