WindowsでUDP通信・ポート確認をする方法(PowerShell/ncat)

「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-NetUDPEndpointnetstat -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-NetUDPEndpointTest-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に標準で入っています。LocalAddressLocalPortOwningProcess(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-NetUDPEndpointnetstat -an -p UDPで。
  • コマンドライン全般でのUDPの基本(telnetが使えない理由とncの使い方)はコマンドラインでUDP通信を試す方法、ポートが開いているかの確認そのものについてはUDPポートが開いているか確認する方法もあわせてどうぞ。