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
参考 URL
- http://mroom.xii.jp/nikki/2013/05/post-99.html
- https://docs.microsoft.com/ja-jp/advanced-threat-analytics/troubleshooting-ata-known-errors
- https://social.technet.microsoft.com/Forums/ja-JP/81beb3b9-5b2a-40cd-81d8-cbe67f57df04/tcp?forum=win10itprogeneralJP
- https://qiita.com/masoo/items/b73dadb0e99f9be528fe
- https://qiita.com/Hideyasu_Yamazaki/items/2c4cee2c79d928565f9f
- https://system2.wiki/windows/76283.html