소켓 바인딩 시 "System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions" 오류 발생
트위터에서 본,
guywhataguy / SourceCodeVisualizer
; https://github.com/guywhataguy/SourceCodeVisualizer
도구를 실행해 보는데 8080 포트에서 다음과 같이 바인딩 오류가 발생합니다.
c:\temp> visualize.exe
2020/06/23 13:23:26 starting
2020/06/23 13:23:26 listen tcp :8080: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
panic: listen tcp :8080: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
goroutine 1 [running]:
log.Panic(0xc0000c9f28, 0x1, 0x1)
C:/Go/src/log/log.go:351 +0xb3
main.main()
c:/temp/visualize.go:279 +0x38c
이상하군요, 원래 다른 포트가 점유하고 있으면 "Only one usage of each socket address (protocol/network address/port) is normally permitted"와 같은 오류가 발생하는데 "access permissions"가 나오니 좀 당황스럽습니다. 게다가, 무작위로 다른 포트를 몇 개(예를 들어 5359번) 시도했는데 희한하게 모두 저 오류가 발생했습니다. 그나마 대략 10,000번 이후의 포트에 대해서는 저런 오류가 안 나왔는데... 왜 그런 걸까요? ^^
go 언어를 구글이 만들어서 크롬과 유사하게 보안을 위해 막아두는 포트가 있었던 그 문제였나 싶어서 찾아 봤는데,
로컬 PC에서 개발 중인 ASP.NET Core 웹 응용 프로그램을 다른 PC에서도 접근하는 방법
; https://www.sysnet.pe.kr/2/0/12081
그러기에는 "access permissions"에 속하는 포트가 압도적으로 많았습니다. 혹시나... Go 언어만 그런가 싶어 C#으로 만들었더니,
using (Socket srvSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp))
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, int.Parse(args[0]));
srvSocket.Bind(endPoint);
srvSocket.Listen(10);
}
그래도 동일한 오류가 발생하는군요. ^^
C:\temp\ConsoleApp1\bin\Debug> ConsoleApp1.exe 8932
Unhandled Exception: System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Bind(EndPoint localEP)
at ConsoleApp1.Program.Main(String[] args) in C:\temp\ConsoleApp1\ConsoleApp1\Program.cs:line 19
여기까지 오니... 예전에 써두었던 글이 하나 떠올랐습니다. ^^
서버용 Socket에서 사용하는 포트가 충돌한다면?
; https://www.sysnet.pe.kr/2/0/1807
오호~~~ 다음과 같이 엄청난 포트들이 점유되고 있었습니다.
C:\Windows\System32> netsh int ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
80 80
1605 1704
1805 1904
1905 2004
2005 2104
2180 2279
2291 2390
2419 2518
2721 2820
2953 3052
3053 3152
3153 3252
3253 3352
3390 3489
3490 3589
3662 3761
3762 3861
4064 4163
4164 4263
4264 4363
4364 4463
4464 4563
4564 4663
4664 4763
4764 4863
5241 5340
5357 5357
5358 5457
5458 5557
5558 5657
5658 5757
5758 5857
5940 6039
6040 6139
6233 6332
6333 6432
6433 6532
6533 6632
8032 8032
8033 8132
8133 8232
8233 8332
8333 8432
8433 8532
8533 8632
8633 8732
8733 8832
8833 8932
9028 9127
9128 9227
9228 9327
9328 9427
9428 9527
50000 50059 *
* - Administered port exclusions.
도대체 누가 저렇게 등록했는지 소스가 없어서 범인을 찾을 수 없습니다. ^^; 검색해 보면,
Cannot bind to some ports due to permission denied
; https://stackoverflow.com/questions/48478869/cannot-bind-to-some-ports-due-to-permission-denied
Hyper-V가 그렇다고들 하는데, 꼭 그런 것만은 아닌 게 또 다른 Hyper-V 설치 머신에서는 다음과 같이 적은 포트가 점유되어 있었습니다.
C:\Windows\System32> netsh int ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
80 80
1065 1164
1372 1471
1543 1642
1666 1765
1766 1865
1966 2065
2066 2165
2180 2279
2280 2379
2523 2622
2732 2831
2832 2931
5357 5357
8060 8060
50000 50059 *
* - Administered port exclusions.
정리하면, 환경이 다양하다 보니 Binding 시에 해당 포트가 꼭 비어 있지 않을 확률이 점점 더 높아지고 있으니 주의해야겠습니다. ^^ (
excludedportrange 삭제 방법)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]