このポートを使っているのはどのプログラム?
サーバーが8080番ポートで起動しない、あるいはテストが「address already in use」で止まる。原因は、すでにプログラムがそのポートを使っているか、Windowsがそのポートを予約しているかのどちらかで、2つのエラーはよく似ています。見分け方を説明します。
ポートが開けない2つの理由
| 何が起きたか | 現れ方 | 対処 |
|---|---|---|
| プログラムがポートを使っている | エラーは、アドレスがすでに使用中だと伝えます(EADDRINUSE、またはWindowsのエラー10048)。そのプログラムはソケット一覧に現れます。 | そのプログラムを閉じるか、別のポートを選びます。 |
| Windowsがポートを予約している | 待ち受けているものがないのに、アクセスが禁止されていると表示されます(Windowsのエラー10013)。一覧にはプログラムが現れません。 | 予約範囲の外のポートを選ぶか、その範囲を解放します。WinNATサービスの再起動で解決することがよくあります。 |
Windowsに最初からあるもので調べる
ソケット一覧には所有者がプロセスIDで載っています。ポートを探し、次にIDを調べます。
netstat -ano | findstr :8080
tasklist /fi "PID eq 4321"
PowerShellでも同じことができます(TCPとUDPの両方)。
Get-NetTCPConnection -LocalPort 8080 | Select-Object LocalAddress, State, OwningProcess
Get-NetUDPEndpoint -LocalPort 5353 | Select-Object LocalAddress, OwningProcess
Get-Process -Id 4321
ポートを握っているプログラムがない場合は、Windowsが確保している範囲を調べます。
netsh int ipv4 show excludedportrange protocol=tcp
protocol=udp でもう一度実行してください。範囲はプロトコルごとに管理されるため、UDPでは空いていてTCPでは予約されているポートもあります。
Toolsタブで調べる
Toolsタブなら、コンソールなしで同じことを調べられます。
- Socketsは、このコンピューター上のすべてのTCP・UDPソケットを
netstat -anoのように一覧にします。待ち受け中のもの、接続中のもの、その状態、所有するプログラムが分かります。セッションは不要です。lport:8080やstate:listenで検索できます。 - Port checkは、あなたのサーバーが尋ねたことをそのまま調べます。このポートをプログラムは使えるか。8080、
80, 443のような一覧、9000-9100のような範囲(最大1000ポート)を入力して Check を押します。各ポートをTCPとUDP、IPv4とIPv6で試し、Free、In use(プログラムとそのPID付き)、Reserved by Windowsのいずれかで示します。
答えが「はい・いいえ」ではなく表になるのはそのためです。Windowsはプロトコルごとに範囲を予約しますし、IPv6で待ち受けるプログラムは、IPv4では空いているポートを握っていることがあります。
ネットワークには何も送りません。各ポートについて、このコンピューター自身のループバックアドレスでWindowsにポートを求め、すぐに返します。
持ち主が分かったら
どちらの表でも、行を右クリックすると、そのポートを握っているプログラムを対象に設定できます。入力欄が埋まるだけで、START を押すまで何も変わりません。その先は1つのアプリだけを狙うを参照してください。
できないこと
読み取るだけで、修復はしません。プログラムを閉じることも、予約範囲を解放することもありません。別のアカウントのソケットは、管理者として実行しない限りプログラムが表示されません。