プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2020/03/09

System.Net.Sockets.SocketException: 'アクセス許可で禁じられた方法でソケットにアクセスしようとしました。'

update2021/01/20 event_note2020/03/09 7:20

C# で TCP/IP による通信を行うアプリケーションを作成中に、以下のような例外が発生しました。

System.Net.Sockets.SocketException: 'アクセス許可で禁じられた方法でソケットにアクセスしようとしました。'

他のアプリがポートを使用中でないか確認する

まずは以下のコマンドを入力して、指定のアドレスとポートが他のアプリケーションで使用中でないかどうかを確認します。

> netstat -oan

もし使用中であった場合は、そのプロセス ID をもとに、タスクマネージャーなどからアプリケーションを特定すればよいようです。

今回のケースでは使用中のアプリケーションはありませんでした。

他のアプリが TCP ポート除外範囲を設定しているか確認する

以下のコマンドで TCP ポートの除外範囲を確認します。

> netsh int ipv4 show excludedportrange tcp

プロトコル tcp ポート除外範囲

開始ポート    終了ポート
----------    --------
        80          80
     48497       48497
     49892       49991
     50000       50059     *
     50060       50159
     50160       50259
     50460       50559
     50560       50659
     50666       50765
     51162       51261
     54473       54572
     56110       56209
     56210       56309

* - 管理されている除外ポート。

今回はこの TCP ポート除外範囲に含まれているポートを使用していることが原因でした。

対処方法

とりあえずアプリケーション側で使用するポートを変更できるならそれが簡単です。

除外ポートを追加

また、後日わかったことですが、Docker が原因だったようです。

コマンドプロンプトを管理者として実行し、以下を順番に実行します。

Hyper-V を停止

bcdedit /set hypervisorlaunchtype off

とりあえずこれだけでも再起動後はポートが解放されました。

除外ポートを設定

netsh int ip add excludedportrange protocol=udp startport=60000 numberofports=10

プロセスはファイルにアクセスできません。別のプロセスが使用中です。 と表示された場合は一度 Windows を再起動します。

Hyper-V を ON にする

bcdedit /set hypervisorlaunchtype auto