「WindowsでUDP通信を試したいのに、telnetもTest-NetConnectionも使えない」。結論から言うと、Windows標準のtelnetクライアントもTest-NetConnectionもTCP専用で、UDPには使えません。UDPを送受信するには、PowerShellのUdpClientか、ncat(Nmapに含まれるnetcat互換ツール)を使います。
※動作環境について:このページのコマンドは Windows 11(build 26200)+ Windows PowerShell 5.1 で動作を確認しています(2026-07-09)。Windows 10 や PowerShell 7 でも、使っているのは共通の .NET(UdpClient)と NetTCPIP モジュール(Get-NetUDPEndpoint など)なので同じように動くはずですが、表示のこまかな差は環境によって出ることがあります。
結論:WindowsでUDPを試す方法
UDPの送受信には、追加インストールが要らないPowerShellのSystem.Net.Sockets.UdpClientか、Linux/macOSのnc -uとほぼ同じ感覚で使えるncat(Nmapに同梱)を使います。ポートが待ち受けているかどうかだけを見たいなら、Get-NetUDPEndpointやnetstat -an -p UDPで十分です。
telnetとTest-NetConnectionはどちらも選択肢に入りません。まずその理由から説明します。
telnetはUDPに使えない(そもそも既定で無効)
Windows 10/11のtelnetクライアントは、既定では無効化されているオプション機能です。使うには自分で有効化する必要があります。
# 管理者権限のPowerShellで実行 Enable-WindowsOptionalFeature -Online -FeatureName TelnetClient
コントロールパネルからなら「プログラムと機能」→「Windowsの機能の有効化または無効化」→「Telnet Client」にチェックを入れます。
ただし、有効化しても意味がありません。telnetはTCP専用のプロトコルで、UDPのポートには接続できないからです。telnetでncのUDP待受ポートに繋ごうとしても、期待した応答は返ってきません。UDPを試すにはtelnet以外のツールが必要です。
Test-NetConnection もTCP専用(UDPは確認できない)
「PowerShellでポート確認といえばTest-NetConnection」というのはよく見かけますが、これはTCPの疎通確認専用のコマンドです。UDPには使えません。ここを混同している解説をよく見かけるので、はっきり書いておきます。
Microsoft Learnの公式リファレンスを見ると、Test-NetConnectionが受け付けるパラメーターセットは次の4つだけです。
-TraceRoute(ICMP・経路確認)-CommonTCPPort(HTTP/RDP/SMB/WINRMのいずれか)-Port(TCPポート番号。パラメーターの説明にも「Specifies the TCP port number」と明記されている)-DiagnoseRouting(経路選択の診断)
UDP用のパラメーターやオプションはどこにもありません。つまり次のようなコマンドを実行しても、それはTCPの51820番ポートに対する疎通確認であって、UDPの51820番ポートとは無関係です。同じ番号でUDPの51820番だけが開いていても、この結果は「失敗」になります。
Test-NetConnection -ComputerName 192.0.2.10 -Port 51820
手元(Windows 11 + Windows PowerShell 5.1)で確かめました。前述のUdpClientで50007番のUDPリスナーを起動したまま、同じ50007番にTest-NetConnectionをかけると、UDPは開いているのにTCPの接続として失敗します。
Test-NetConnection -ComputerName 127.0.0.1 -Port 50007
警告: TCP connect to (127.0.0.1 : 50007) failed ... TcpTestSucceeded : False
UDPの50007番が待ち受け中でもTcpTestSucceeded : Falseになります。これが、Test-NetConnectionはUDPを見ていないという動かぬ証拠です。
「Test-NetConnectionでUDPのポートが開いているか確認できた」という体験談を見かけたら、それは別の要因(TCPも同時に開いていた、応答なしを都合よく解釈した等)による誤解の可能性が高いです。UDPを確認したいときは、この後のUdpClientかncatを使ってください。
PowerShellでUDPを送受信する(UdpClient)
追加ソフトのインストールが要らない方法です。.NETのSystem.Net.Sockets.UdpClientクラスをPowerShellから直接呼び出します。
受信側(リスナー)
先に受信側を起動しておきます。Ctrl+Cで終了します。
$udp = New-Object System.Net.Sockets.UdpClient(50007)
Write-Host "UDP 50007番ポートで受信待機中..."
while ($true) {
$remote = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
$bytes = $udp.Receive([ref]$remote)
$text = [System.Text.Encoding]::UTF8.GetString($bytes)
Write-Host "[$($remote.Address):$($remote.Port)] $text"
}
New-Object System.Net.Sockets.UdpClient(50007)で、ローカルの50007番ポートを使うUdpClientを作ります(コンストラクタにポート番号を渡すと、そのポートにバインドされます)。Receive([ref]$remote)は、データが届くまで処理を止めて待つ(ブロッキング)メソッドです。届いたデータをバイト配列で返し、$remoteに送信元のIPアドレスとポート番号が入ります。
送信側
$udp = New-Object System.Net.Sockets.UdpClient
$bytes = [System.Text.Encoding]::UTF8.GetBytes("Hello from PowerShell")
$udp.Send($bytes, $bytes.Length, "192.0.2.10", 50007)
$udp.Close()
Send(バイト配列, 長さ, 宛先ホスト, 宛先ポート) の形で1回分のデータグラムを送ります。宛先を先に固定したい場合は Connect("192.0.2.10", 50007) を呼んでから Send($bytes, $bytes.Length) だけで送ることもできます。
UDPはコネクションレス(接続の概念がない)なので、この送信が届いたかどうかはこのコマンドだけでは分かりません。受信側の画面にメッセージが表示されて初めて「届いた」と確認できます。応答が無くても、相手のポートが閉じているとは限らない点に注意してください(詳しくはUDPポートが開いているか確認する方法で扱います)。
PowerShellのバージョンについて
UdpClientはPowerShellのバージョンを問わず同じ書き方で動きます(Windows PowerShell 5.1でも、.NET上で動くPowerShell 7でも共通のAPIです)。一方、後述するGet-NetUDPEndpointやTest-NetConnectionはWindows専用のモジュール(NetTCPIP)が提供するコマンドで、PowerShell 7からはWindows PowerShell との互換機能(WinCompat)経由で動きます。挙動に差を感じたら、この違いを思い出してください。
ncat(Nmap)でLinux/macOSと同じ操作をする
「nc -u のコマンド操作にそのまま慣れたい」という場合は、ncatを使うのが早道です。ncatはNmapプロジェクトが配布しているnetcat互換ツールで、Windows版も公式に用意されています。
インストール
nmap.org の公式ダウンロードページからWindows用インストーラー(nmap-<version>-setup.exe)を取得して実行します。インストール項目の選択画面で「Ncat」にチェックが入っていることを確認してください(既定でオンになっています)。単体のncatだけが欲しい場合も、配布はこのNmapインストーラー経由が公式手段です。
使い方
Linux/macOSのnc -uとほぼ同じ書き方です。
# 受信側(リスナー) ncat -u -l 50007 # 送信側 ncat -u 192.0.2.10 50007
送信側でキーボード入力した内容が、受信側の画面にそのまま表示されれば疎通しています。-vを付けると接続状況の詳細が出るので、最初は付けておくと分かりやすいです。nc/ncatのオプションをもっと詳しく知りたい場合は、netcat(nc)でUDP通信する使い方まとめにまとめています。
UDPポートの待受状況を確認する
「相手ではなく自分のマシンで、UDPのどのポートが待ち受けているか」を見たいときは、送受信ツールではなくこちらを使います。
PowerShell(Get-NetUDPEndpoint)
# すべてのUDP待受ポートを一覧 Get-NetUDPEndpoint # 特定のポートだけ確認 Get-NetUDPEndpoint -LocalPort 50007
NetTCPIPモジュールのコマンドで、Windows 8/Server 2012以降のWindowsに標準で入っています。LocalAddress・LocalPort・OwningProcess(PID)などが確認できます。プロセス名まで見たい場合は、OwningProcessの値をGet-Process -Idに渡してください。
Get-NetUDPEndpoint -LocalPort 50007 |
Select-Object LocalAddress, LocalPort, OwningProcess,
@{n='ProcessName'; e={(Get-Process -Id $_.OwningProcess).ProcessName}}
コマンドプロンプト/PowerShell共通(netstat)
もっと手軽に見たいときはnetstatです。
netstat -an -p UDP
-p UDPでUDPの接続(正確には待受ソケット)だけに絞り込みます。PIDも一緒に見たい場合は-oを追加します。
netstat -an -p UDP -o
UDPはコネクションレスなので、
netstatに「Established(接続確立)」の状態は出ません。表示されるのは「そのポートで誰かが待ち受けているか」だけです。TCPの感覚で「接続中かどうか」を探しても出てこないので注意してください。
おまけ:Windows Defender ファイアウォールの確認
UDPで送受信してもうまく届かないときは、Windows Defender ファイアウォールの受信規則がブロックしていないかも確認してください。
# 特定ポート(UDP)向けの受信規則を検索
Get-NetFirewallRule -Direction Inbound -Enabled True |
Get-NetFirewallPortFilter |
Where-Object { $_.Protocol -eq 'UDP' -and $_.LocalPort -eq '50007' }
該当する規則が見つからない場合、そのポートへのUDP受信は既定のブロック対象になっている可能性があります。
さいごに
- Windowsのtelnetはそもそも既定で無効なうえ、TCP専用でUDPには元々使えません。
Test-NetConnectionもTCP専用です。UDPの確認に使えるという体験談は誤解の可能性が高いので、鵜呑みにしないでください。- UDPの送受信は、追加インストール不要なPowerShellの
UdpClientか、Linux/macOSと同じ感覚で使えるncatのどちらかを使います。 - 待受ポートの確認は
Get-NetUDPEndpointかnetstat -an -p UDPで。 - コマンドライン全般でのUDPの基本(telnetが使えない理由とncの使い方)はコマンドラインでUDP通信を試す方法、ポートが開いているかの確認そのものについてはUDPポートが開いているか確認する方法もあわせてどうぞ。