コマンドラインから簡単にUDP通信を行うには

最終更新

2026年7月、内容を全面的に書き直しました。nc のオプションが OS によって違う点と、Windows での代替手段を新たに追記しています。


telnet で UDP のポートに繋ごうとして、telnet: Unable to connect to remote host のようなエラーで止まった方向けの記事です。

結論から言うと、telnet は TCP 専用のツールなので UDP 通信には使えません。UDP を試すなら nc(netcat)コマンドを使います。

# 受信側(待ち受け)
nc -u -l 12345

# 送信側(別の端末やホストから)
echo "hello" | nc -u 127.0.0.1 12345

受信側の端末に hello と表示されれば成功です。

なぜ telnet では UDP を試せないのか

telnet はもともと TCP 上のリモートログインプロトコル(あるいはそのクライアント)を指す言葉で、UDP の接続機能を持っていません。TCP は接続を確立してからデータをやり取りしますが、UDP にはその「接続」という概念自体がなく、telnet の作りとは根本的に噛み合いません。

UDP で任意のポートにデータを送ったり、ポートを開けて待ち受けたりしたいときは、TCP・UDP の両方を扱える nc を使うのが定番です。

nc は系統によってオプションが違う

nc という名前のコマンドは複数あり、同じ -l(listen)や -u(UDP)でも書き方が微妙に違います。ここでつまずく人が多いので、最初に押さえておいてください。

系統主な入手経路UDP待ち受けの書き方
OpenBSD ncmacOS標準 / Debian・Ubuntuの netcat-openbsdnc -u -l 12345
GNU netcat(traditional)Debianの netcat-traditional などnc -u -l -p 12345
Nmap Ncatnmap-ncat(RHEL/Fedora系)、Homebrewの nmap 同梱ncat -u -l 12345

たとえば OpenBSD 系(macOSの標準 nc もこれ)では -l-p を同時に指定するとエラーになります。

$ nc -u -l -p 12345
nc: missing port with option -l

「ネットで見つけたコマンドをコピペしたのに動かない」というときは、まず自分の nc がどの系統かを疑ってください。man nc の冒頭(NAME・SYNOPSIS)を見ればだいたい判別できます。各系統のオプションをもっと詳しく知りたい場合は netcat(nc)でUDP通信する使い方まとめ を参照してください。

手順:ncでUDP通信を試す

ここでは OpenBSD 系(macOS標準)の書き方で進めます。2つの端末を用意してください。

  1. 受信側の端末で待ち受けを開始します。

sh nc -u -l 12345

  1. 送信側の端末から、1文字以上のデータを送ります。

sh echo "hello" | nc -u 127.0.0.1 12345

  1. 受信側の端末に hello と表示されれば、UDP でデータが届いています。

同じマシンで試す場合は、ターミナルを2枚開いて片方で1、もう片方で2を実行してください。別ホストに送る場合は 127.0.0.1 をそのホストのIPアドレスに置き換えます。

nc が入っていない場合

macOS と多くの Linux ディストリビューションには標準で入っていますが、無い場合は以下でインストールします。パッケージ名がディストリごとに違う点に注意してください。

# Debian / Ubuntu
sudo apt install netcat-openbsd

# RHEL / CentOS / Fedora
sudo dnf install nmap-ncat

# macOS(Homebrew)
# 標準の nc がそのまま使えます。Nmap Ncat が欲しい場合のみ
brew install nmap

Debian/Ubuntu の netcat パッケージは中身を持たない移行用パッケージで、実体は netcat-openbsd などに委譲されています。名指しでインストールするなら netcat-openbsd を指定するのが確実です。

応答が無くても異常とは限らない

UDP はコネクションレスなプロトコルなので、送っても何も返ってこないのが普通です。ポートが開いていても、相手のアプリケーションが何かデータを返す作りになっていなければ無反応ですし、逆に閉じたポートに送っても nc 側では「成功」のように見えることがあります。

$ nc -u -v -w1 127.0.0.1 54321
Connection to 127.0.0.1 port 54321 [udp/*] succeeded!

このホストの54321番ポートで何も待ち受けていなくても、上のように「succeeded」と出ます。UDP はデータを送りつけるだけで相手の応答を待たない性質上、nc 側だけでは「本当に届いたか」を判断できません。ポートが開いているかどうかをちゃんと確認したい場合は、UDPポートが開いているか確認する方法 の手順を使ってください。

Windowsの場合

Windows は telnet クライアントが既定で無効になっており、そもそも nc も標準では入っていません。PowerShell の Test-NetConnection は TCP 専用で UDP には使えないなど、Linux/macOSとは勝手が異なります。Windows で試したい方は WindowsでUDP通信・ポート確認をする方法 を参照してください。

あわせて読みたい


※以下は旧記事です。

Linux/MacなどでコマンドラインからTCP通信を行うには、telnetがよく使われますね。

HTTPアクセスをtelnetで行う例:

telnet example.com 80
GET / HTTP/1.1(改行)
Host: example.com(改行)
Connection: close(改行)
(空行)

HTTP 200 OK
Content-Type: text/html
... 以下略

UDPでTCPと同じようにテキストベースの通信を行うには、netcat(ncコマンド)が便利です。
netcatはtelnetの機能拡張版ともいえるツールで、TCP/UDPプロトコルを扱う上ではぜひ導入しておきたいものです。

nc コマンドが手元にインストールされてない場合、

CentOS系Linuxなら sudo yum install netcat

Debian なら sudo apt-get install netcat

OS X(Homebrew)なら brew install netcat

でインストールできるかと思います。

netcatは基本的にはtelnetと同じ使い方ができます。

使い方:

netcat -u 接続先IPまたはホスト名 ポート

-u はUDP通信を表すオプションで、省略するとデフォルトでTCP通信になります。
telnet同様、パイプなしで実行すると、標準入力待ち状態になり、Ctrl-Cで切断できます。

また、telnetと違い、サーバになることもできます。

netcat -l -u -p port

-l は Listenモード(サーバモード)、
-u はudpプロトコルでの待受を意味します。(省略するとTCPプロトコル)
-p は待ち受けるポート番号です。

簡易通信サーバになって接続をテストすることも可能です。便利ですね。

もちろん、サーバ・クライアント両方ともncでも通信できます。

サーバ側コンソール(ローカル):

$ nc -l -p 55440 # 適当なTCPポート55440で待受(udpでもOK)

クライアント側コンソール(ローカル):

$ nc localhost 55440 # サーバにつなぐ。(TCPならtelnetでもOK)
hogehoge(改行)

こうすると、サーバ側コンソールに hogehoge と表示されます。
逆にサーバ→クライアントにメッセージを送ることも可能です。

また、上記の例では同一ホストで実行していますが、もちろんIPアドレス、ドメイン指定などで別マシンとも通信できます。

ローカルでやると動くのに、別マシンにはつながらない、という場合はファイアウォールを確認するとだいたい解決するかと思います。
終了できない!と焦ったら、Ctrl-Cを推してみましょう。

ぜひご自身で色々試してみて下さい!

あわせて読みたい