Windows このポートは誰が使っているの？

# 3000ポートがすでに使われている

## 1.問題 bun run dev を実行するとエラーが発生した
コマンドラインから bun を実行
`bun run dev` を実行すると

```powershell
> bun run dev

$ bun run --hot src/index.tsx
17 |    }, reportError);
18 | } else if (typeof entryNamespace?.default?.fetch === 'function') {
19 |    var server = globalThis[hmrSymbol];
20 |    if (server) {
21 |       server.reload(entryNamespace.default);
22 |       server = globalThis[hmrSymbol] = Bun.serve(entryNamespace.default);
     ^
EADDRINUSE: Failed to start server. Is port 3000 in use?
 syscall: "listen"

      at bun:main:22:49
17 |    }, reportError);
18 | } else if (typeof entryNamespace?.default?.fetch === 'function') {
19 |    var server = globalThis[hmrSymbol];
20 |    if (server) {
21 |       server.reload(entryNamespace.default);
22 |       server = globalThis[hmrSymbol] = Bun.serve(entryNamespace.default);
     ^
EADDRINUSE: Failed to start server. Is port 3000 in use?
 syscall: "listen"
```
```
EADDRINUSE: Failed to start server. Is port 3000 in use?
翻訳
EADDRINUSE: サーバーの起動に失敗しました。ポート3000は使用中ですか?
```

3000ポートが既に使われていて起動できないようだ


## ２．3000ポートをどのプログラムが塞いでいるのか？
### コマンドプロンプトから確認する方法
`netstat -ano` で確認

```powershell
PS C:\> netstat -ano

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:22             0.0.0.0:0              LISTENING       5968
  TCP         0.0.0.0:135            0.0.0.0:0              LISTENING       1644
  TCP         0.0.0.0:445            0.0.0.0:0              LISTENING       4
～～～
```
表示量が多すぎるので `findstr` を使って絞り込む


```powershell
netstat -ano | findstr :3000
```

```powershell
PS C:\> netstat -ano | findstr :3000
  TCP         0.0.0.0:3000           0.0.0.0:0              LISTENING       5968
```

今回はPIDが 5968 のプログラムがポートを使用している

- タスクマネージャーから確認してみる
  Ctrl+Shift+Esc キーを押してタスクマネージャー を開きます。
  [タスクマネージャー]から[詳細] PIDでソートする

![task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522015/477c0701-9b85-f664-c984-00659db929de.png)

:::note info
svchost.exe とは、
Windows NT 系オペレーティングシステムにおいて、複数の Windows サービスをホストするシステムプロセスです。
:::

svshost 自体がポートを使用するプログラムではないので、svshostを使用しているプログラムを探す

## ポートを使用しているプログラムは？
### 普通のプログラムがポートを使用しているのであれば 
- 右クリック、プロパティを表示
- プログラムの情報が表示される
  - プログラムを終了させる

## 今回の svcHost.exe は何によって起動されているのか？
- 右クリック、サービスの表示
サービスが表示される
![service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522015/ab6c4ca7-f283-d957-90a3-19877275e50a.png)

### iphlpsvc  5968 IP Helper が起動中
- iphlpsvc ってなんだろう？
:::note info
Windowsのiphlpsvcとは？
iphlpsvc は、Windowsのシステムサービスの一つで、正式名称は「IP Helper」サービスです。このサービスは、ネットワーク設定の管理を支援し、様々なネットワークプロトコル（IPv6、ポートプロキシなど）間の接続を円滑にする役割を果たしています。
:::
どうやら、このプログラムが直接起動して,ポートを使っているわけではなさそうだ

### 別のアプローチを探す


## ３．別解を求める  3000ポート って開発でよく使うポートだよな？

https://learn.microsoft.com/ja-jp/windows/wsl/networking

https://zenn.dev/splusl_at/articles/wsl2-connect-outside

wslで起動させたサーバーに外部からアクセスするにはポートプロキシが必要だったので、
- [【WSL2】外部からWSL2のサービスに接続する] のPowerShellスクリプトを管理者権限で実行していた

- ただし、再起動すると設定は消えてしまうので必要になった都度実行していた

ポートプロキシが残っているか確認してみる（ポートがどうなっているか確認）
```
netsh interface portproxy show all
```

```
PS C:\> netsh interface portproxy show all

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               22          172.22.0.1      22
*               3000        172.22.0.1      3000
*               3001        172.22.0.1      3001
*               8080        172.22.0.1      8080
*               38585       172.22.0.1      38000
```
なぜか 3000ポートが wsl に接続されていた
以前は、再起動すると設定が消えていたのに（いつの間にか設定が残るようになった？）


wsl側でもポートが使用中か確認
```shell:wsl
sudo lsof -i:3000
# または
sudo ss -tulpn | grep :3000
```
wsl側では 3000 ポートを使用していなかった

:::note alert
ポートプロキシ設定が行われていると、wslでポートを使っていなくてもポートが使用中となる
:::
<font color="red">先に押さえられているので、それは使えないですね</font>

とりあえず、削除
管理者権限のPowerShellから
```powershell:PowerShell 管理者
netsh interface portproxy delete v4tov4 listenaddress=* listenport=3000
```

## bun を実行する
コマンドラインから bun を実行
`bun run dev` を実行する
```
> bun run dev
$ bun run --hot src/index.tsx
Started server http://localhost:3000
```

# 原因
## いつの頃からかポートプロキシ設定が再起動しても消えなくなっていた

以前は起動するたびに、管理者権限のPowerShellでポートプロキシを設定しなければいけなかったのに、いつの間にかポートプロキシの設定を記憶するようになっていた。