自分の備忘禄として
WindowsでUDPを送信するのにパワーシェルを使って送信するのに折角なので下記の様なフォームに入力して実行する物を作ってみました。
ついでにTCPも送る様にしました。
コードなどはもっとこうした方が良いなどは多々あると思いますので、あくまで参考までに
Powershellはどの業務PCでも大体使用できるので
UDPはこんな感じ
※UDPは相手への到達性が無くても実行されます


TCPを送るとこんな感じ


ps1 で実行すると後ろにPowershellのウインドウが開くので、バッチにして開くのがお勧め
powershell.exe -WindowStyle Hidden -ExecutionPolicy RemoteSigned “ps1へのパス”
Formを作らなくても下記のコマンドを実行するだけでもUDPの送信はできるので、急ぎの時はこちらで
$udp_obj = New-Object System.Net.Sockets.UdpClient
$udp_byte = [Text.Encoding]::UTF8.GetBytes('UDP-TESST')
#送信先は""で囲う
$udp_obj.Send($udp_byte, $udp_byte.Length, "X.X.X.X" or "FQDN", ポート番号 )
コード
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
#フォーム処理関数
function check_form(){
$logbox.Clear()
$port = $textBox_port.text
$addr = $textBox_addr.Text
$now= Get-Date -Format "yyyy/MM/dd HH:mm:ss"
#Nullチェック
if ([String]::IsNullOrEmpty($addr) -or [String]::IsNullOrEmpty($port) ){
$logbox.AppendText("値が空です")
return
}
#ポート番号の数値型チェック
if (-not([int64]::TryParse($port,[ref]$null))) {
$logbox.AppendText("数値以外の値なので、修正して下さい")
return
}
#ポート番号を数値型に変換してポート番号確認
$port_No = [int64]$port #int型に入れないと何故か文字列扱いになったから
if ($port_No -ge 65535) {
$logbox.AppendText("ポート番号:$port`r`nポート番号は0〜65535です")
return
}
try{
if ($tcp_radio.Checked){
$logbox.forecolor = "black"
$logbox.AppendText("実行中・・・")
$ping_res = Test-Connection $addr -Quiet #Test-netConnectionが何でだかQuietで無いと失敗するのでここでPingを実施
$tcp_res = Test-netConnection $addr -port $port_No -InformationLevel Quiet #何でだかQuietで無いと失敗する
$logbox.Clear()
$logbox.AppendText("宛先=$addr Port=:$port `r`n")
$logbox.AppendText("[$now] ping=$($ping_res) TCP=$($tcp_res)")
} elseif ($udp_radio.Checked){
#UDP送信用
$udp_obj = New-Object System.Net.Sockets.UdpClient
#UDP送信用データ内容
$udp_byte = [Text.Encoding]::UTF8.GetBytes('UDP-TESST')
$i = 1
$logbox.forecolor = "black"
while ($i -le 4) {
# (送信データ, 送信データサイズ, 宛先アドレス, 宛先ポート番号)
$udp_obj.Send($udp_byte, $udp_byte.Length, $textBox_addr.text, $textBox_port.text)
$logbox.AppendText("$($i)回目送信 Addr=$addr Port=:$port `r`n")
$i += 1
}
}
}
catch{
$logbox.AppendText("FQDNが間違っている")
return
}
}
# フォームの作成
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Data Entry Form'
$form.Size = New-Object System.Drawing.Size(500,450)
$form.StartPosition = 'CenterScreen'
# フォントの設定
$font = New-Object System.Drawing.Font("MS ゴシック",15)
#グループ枠
$GroupBox = New-Object System.Windows.Forms.GroupBox
$GroupBox.Location = New-Object System.Drawing.Point(10,10)
$GroupBox.size = New-Object System.Drawing.Size(200,60)
$GroupBox.text = "TCP/UDP"
$form.Controls.Add($GroupBox)
#ラジオボタン
$tcp_radio = New-Object System.Windows.Forms.RadioButton
$tcp_radio.Location = New-Object System.Drawing.Point(20,20)
$tcp_radio.size = New-Object System.Drawing.Size(80,30)
$tcp_radio.Checked = $True
$tcp_radio.Text = "TCP"
$udp_radio = New-Object System.Windows.Forms.RadioButton
$udp_radio.Location = New-Object System.Drawing.Point(110,20)
$udp_radio.size = New-Object System.Drawing.Size(80,30)
$udp_radio.Text = "UDP"
#グループ枠にラジオボタンを追加
$GroupBox.Controls.AddRange(@($tcp_radio,$udp_radio))
# ラベル1の設定
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,90)
$label.Size = New-Object System.Drawing.Size(180,30)
$label.Text = '宛先IPアドレス:'
$label.font = $font
$form.Controls.Add($label)
# 入力ボックス1の設定
$textBox_addr = New-Object System.Windows.Forms.TextBox
$textBox_addr.Location = New-Object System.Drawing.Point(190,90)
$textBox_addr.Size = New-Object System.Drawing.Size(200,30)
$textBox_addr.font = $font
$form.Controls.Add($textBox_addr)
# ラベル2の設定
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = New-Object System.Drawing.Point(10,140)
$label2.Size = New-Object System.Drawing.Size(180,30)
$label2.Text = '送信ポート:'
$label2.font = $font
$form.Controls.Add($label2)
# 入力ボックス2の設定
$textBox_port = New-Object System.Windows.Forms.TextBox
$textBox_port.Location = New-Object System.Drawing.Point(190,140)
$textBox_port.Size = New-Object System.Drawing.Size(200,30)
$textBox_port.font = $font
$form.Controls.Add($textBox_port)
# OKボタン
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(200,200)
$okButton.Size = New-Object System.Drawing.Size(80,30)
$okButton.Text = 'OK'
#$okButton.DialogResult = 'OK'
$okButton.Add_Click( { check_form }) #OKボタンを押すと関数を実行
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
# キャンセルボタン
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(300,200)
$cancelButton.Size = New-Object System.Drawing.Size(80,30)
$cancelButton.Text = '終了'
$cancelButton.DialogResult = "Cancel"
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
#ログテキストボックス
$script:logbox = New-Object System.Windows.Forms.TextBox
$logbox.Multiline = $true #複数行表示
$logbox.Location = New-Object System.Drawing.Point(20,250)
$logbox.Size = New-Object System.Drawing.Size(450,100)
$logbox.ScrollBars = "Vertical" #縦のスクロールバーを表示
$logbox.font = "MS ゴシック,13"
$logbox.forecolor = "red"
$form.Controls.Add($logbox) #フォームに追加
# 最前面に表示する
$form.Topmost = $True
# フォームが表示されたとき入力ボックス部分を選択した状態にする
$form.Add_Shown({$textBox_addr.Select()})
$form.ShowDialog()


コメント