自分の備忘禄として
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') #送信先がFQDNの場合は""で囲う $udp_obj.Send($udp_byte, $udp_byte.Length, 宛先IP 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()
コメント