Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

UWP 앱에서 한 컴퓨터(localhost, 127.0.0.1) 내에서의 소켓 연결

아래의 질문이 있길래,

uwp에서 TcpListener를 사용할 수 없나요?
; https://www.sysnet.pe.kr/3/0/5089

저도 테스트를 해봤습니다. ^^ UWP에서 제공하는 2가지 TCP 소켓 방식을 모두 사용해 대기해 봤는데요,

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            ServerTest1();
            ServerTest2();
        }

        Windows.Networking.Sockets.StreamSocketListener _streamSocketListener;

        private async void ServerTest1()
        {
            _streamSocketListener = new Windows.Networking.Sockets.StreamSocketListener();
            _streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;
            await _streamSocketListener.BindServiceNameAsync("2345");
        }

        private async void StreamSocketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
        {
            Debug.WriteLine("StreamSocketListener_ConnectionReceived");
            sender.Dispose();
        }

        private async void ServerTest2()
        {
            TcpListener server = new TcpListener(IPAddress.Any, 2346);
            server.Start();

            Debug.WriteLine("서버 시작");
            var client = await server.AcceptTcpClientAsync();
            Debug.WriteLine("서버 성공");
        }
    }
}

다음의 권한도 함께 줘 실행한 경우,

<Capability Name="privateNetworkClientServer" />

결론은, 질문자의 상황과 같았습니다.

.NET 서버 <-> .NET 클라이언트 = 성공
.NET 서버 <-> UWP 클라이언트 = 성공
UWP 서버 <-> UWP 클라이언트 = 실패
UWP 서버 <-> .NET 클라이언트 = 실패

즉, 같은 PC 내에서는 UWP 앱에서 TCP 서버를 만들어 제공할 수는 없었습니다. 단지, 다른 PC로부터 접속하는 경우라면 다음의 권한을 추가만 해주면,

<Capability Name="internetClientServer" />

TCP 서버로써 정상적인 역할을 합니다.




이 기능에 관한 이력은 알 수 없으나 검색해 보면, 초기에는 같은 PC 내에서도 UWP 앱 측에서 TCP 서버로 기능을 했던 것 같습니다. 단지 이후에 보안상의 이유로 막았다는 것 같은데요, 그런데 아래의 문서를 읽어보면,

Docs/Windows/UWP/Develop/Networking and web services/앱 개발/통신/네트워킹 및 웹 서비스/소켓
; https://learn.microsoft.com/ko-kr/windows/uwp/networking/sockets

네트워크 격리의 결과로 Windows는 로컬 루프백 주소(127.0.0.0)를 통해서나 로컬 IP 주소를 명시적으로 지정하여 동일한 시스템에서 실행 중인 UWP 앱 두 개 사이의 소켓 연결(소켓 또는 WinSock) 설정을 허용하지 않습니다. UWP 앱이 서로 통신할 수 있도록 하는 메커니즘에 대한 자세한 내용은 앱 간 통신을 참조하세요.


"UWP 앱 두 개 사이의 소켓 연결"이라고 하는 것에서 왠지 일반 데스크톱이라면 가능하지 않을까? 라는 여지를 갖게 합니다. 물론 테스트를 해보면 (관리자 권한일지라도) 데스크톱 응용 프로그램 역시 UWP 앱에서 열어 놓은 TCP 서버에는 접속할 수 없습니다.

그런데 저 문서뿐만 아니라 "CheckNetIsolation" 프로그램에 대한 설정도 왠지 개발자를 혼란에 빠뜨리게 합니다.

Enabling Loopback for MS Edge with Windows 10
; https://www.ibm.com/support/knowledgecenter/en/SSPH29_9.0.3/com.ibm.help.common.infocenter.aps/r_LoopbackForEdge.html

Package.appxmanifest의 "Packaging" 탭에 있는 "Package family name" 값(이 글에서는 "7e74130d-0dde-409b-adc1-44dc4c5137fc_2846pq4653gqa")으로 다음과 같이 CheckNetIsolation을 실행하고,

CheckNetIsolation LoopbackExempt -a -n="7e74130d-0dde-409b-adc1-44dc4c5137fc_2846pq4653gqa"

권한까지 주면,

<Capability Name="privateNetworkClientServer" />

해당 UWP 앱은 localhost로의 접속이 가능합니다. 따라서, 이 방법을 사용하면 같은 PC 내의 UWP 앱에서 제공하는 TCP Server에도 접속할 것 같은 느낌이 드는데요, 그래도 접속할 수 없는 것은 마찬가지입니다. 즉, 이 옵션을 주면 같은 PC 내의 비-UWP 응용 프로그램이 열어 놓은 TCP 서버로 접속 가능한 것입니다.




참고로, CheckNetIsolation으로 이미 설정된 목록을 -s 옵션으로 볼 수 있습니다.

C:\Windows\System32>CheckNetIsolation LoopbackExempt -s

List Loopback Exempted AppContainers

[1] -----------------------------------------------------------------
    Name: e3874fef-6298-4f36-92d0-c3dee93a0af9_8wekyb3d8bbwe
    SID:  S-1-15-7-1540256326-2870764848-967293167-2470951913-2147672149-3757691537-2504242156

[2] -----------------------------------------------------------------
    Name: da29541c-1efc-4ba7-9e7e-af73c818513e_2846pq4653gqa
    SID:  S-1-15-7-3297226826-4264591352-2292705388-1537415806-1543069546-1598715701-2109803276

[3] -----------------------------------------------------------------
    Name: 36f6fa81-5827-46e0-afc6-2974a316a715_2846pq4653gqa
    SID:  S-1-15-7-704375632-1530588768-762434507-3187168021-1340731922-1574151383-1637619547

[4] -----------------------------------------------------------------
    Name: microsoft.microsoftedge_8wekyb3d8bbwe
    SID:  S-1-15-7-3624051432-2155758914-1422191567-1740899205-1073925389-3762572162-737981394

[5] -----------------------------------------------------------------
    Name: AppContainer NOT FOUND
    SID:  S-1-15-7-3624051432-2155758914-1422191567-1740899205-1073925389-3762572162-737981394-4043415302-551583165-304772019-4009825106

OK.

위의 출력 결과에서 "Name" 필드는 "Package family name"이므로 삭제 시에는 이를 참조해 -d 옵션을 주면 됩니다. 가령, 3번 항목을 삭제하고 싶다면 이렇게 실행합니다.

CheckNetIsolation.exe LoopbackExempt ?d ?n="36f6fa81-5827-46e0-afc6-2974a316a715_2846pq4653gqa"

그런데, "AppContainer NOT FOUND"라고 나오면서 "Package family name"을 확인할 수 없는 항목도 있는데 이런 경우에는 SID를 기준으로 삭제할 수 있도록 -p 옵션이 제공됩니다. 따라서 5번 항목을 삭제하고 싶다면 다음과 같이 실행하면 됩니다.

CheckNetIsolation LoopbackExempt -d -p="S-1-15-7-3624051432-2155758914-...[생략]...-551583165-304772019-4009825106"

마지막으로, 4번 항목을 보면 이름이 "microsoft.microsoftedge_8wekyb3d8bbwe"라고 바로 그 "Microsoft Edge" 웹 브라우저를 의미합니다. 즉, UWP 앱 모드의 Edge 브라우저도 저 항목을 등록해 두었기 때문에 (개발 시에 IISEXPRESS가 열어놓은 ASP.NET 사이트를) localhost로 접근할 수 있었던 것입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/9/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13080정성태6/17/20226984개발 환경 구성: 643. Visual Studio 2022 17.2 버전에서 C# 11 또는 .NET 7.0 preview 적용
13079정성태6/17/20224650오류 유형: 814. 파이썬 - Error: The file/path provided (...) does not appear to exist
13078정성태6/16/20226693.NET Framework: 2021. WPF - UI Thread와 Render Thread파일 다운로드1
13077정성태6/15/20227020스크립트: 40. 파이썬 - PostgreSQL 환경 구성
13075정성태6/15/20225978Linux: 50. Linux - apt와 apt-get의 차이 [2]
13074정성태6/13/20226295.NET Framework: 2020. C# - NTFS 파일에 사용자 정의 속성값 추가하는 방법파일 다운로드1
13073정성태6/12/20226521Windows: 207. Windows Server 2022에 도입된 WSL 2
13072정성태6/10/20226795Linux: 49. Linux - ls 명령어로 출력되는 디렉터리 색상 변경 방법
13071정성태6/9/20227368스크립트: 39. Python에서 cx_Oracle 환경 구성
13070정성태6/8/20227181오류 유형: 813. Windows 11에서 입력 포커스가 바뀌는 문제 [1]
13069정성태5/26/20229411.NET Framework: 2019. C# - .NET에서 제공하는 3가지 Timer 비교 [2]
13068정성태5/24/20227901.NET Framework: 2018. C# - 일정 크기를 할당하는 동안 GC를 (가능한) 멈추는 방법 [1]파일 다운로드1
13067정성태5/23/20227228Windows: 206. Outlook - 1년 이상 지난 메일이 기본적으로 안 보이는 문제
13066정성태5/23/20226555Windows: 205. Windows 11 - Windows + S(또는 Q)로 뜨는 작업 표시줄의 검색 바가 동작하지 않는 경우
13065정성태5/20/20227232.NET Framework: 2017. C# - Windows I/O Ring 소개 [2]파일 다운로드1
13064정성태5/18/20226760.NET Framework: 2016. C# - JIT 컴파일러의 인라인 메서드 처리 유무
13063정성태5/18/20227181.NET Framework: 2015. C# - 인라인 메서드(inline methods)
13062정성태5/17/20227999.NET Framework: 2014. C# - async/await 그리고 스레드 (4) 비동기 I/O 재현파일 다운로드1
13061정성태5/16/20226804.NET Framework: 2013. C# - FILE_FLAG_OVERLAPPED가 적용된 파일의 읽기/쓰기 시 Position 관리파일 다운로드1
13060정성태5/15/20229288.NET Framework: 2012. C# - async/await 그리고 스레드 (3) Task.Delay 재현파일 다운로드1
13059정성태5/14/20227737.NET Framework: 2011. C# - CLR ThreadPool의 I/O 스레드에 작업을 맡기는 방법 [1]파일 다운로드1
13058정성태5/13/20227647.NET Framework: 2010. C# - ThreadPool.SetMaxThreads 사용법
13057정성태5/12/20229328오류 유형: 812. 파이썬 - ImportError: cannot import name ...
13056정성태5/12/20226457.NET Framework: 2009. C# - async/await 그리고 스레드 (2) MyTask의 호출 흐름 [2]파일 다운로드1
13055정성태5/11/20229393.NET Framework: 2008. C# - async/await 그리고 스레드 (1) MyTask로 재현 [11]파일 다운로드1
13054정성태5/11/20226874.NET Framework: 2007. C# - 10진수 숫자를 담은 문자열을 숫자로 변환하는 방법 [11]파일 다운로드1
... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...