Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 9개 있습니다.)
(시리즈 글이 3개 있습니다.)
Windows: 171. "Administered port exclusions" 설명
; https://www.sysnet.pe.kr/2/0/12293

Windows: 172. "Administered port exclusions"이 아닌 포트 범위 항목을 삭제하는 방법
; https://www.sysnet.pe.kr/2/0/12305

닷넷: 2158. C# - 소켓 포트를 미리 시스템에 등록/예약해 사용하는 방법(Port Exclusion Ranges)
; https://www.sysnet.pe.kr/2/0/13439




"Administered port exclusions"이 아닌 포트 범위 항목을 삭제하는 방법

지난번 글에서,

"Administered port exclusions" 설명
; https://www.sysnet.pe.kr/2/0/12293

netsh로 추가하지 않은 항목의 경우, 즉 CreatePersistentTcpPortReservation / CreatePersistentUdpPortReservation 함수로 직접 생성한 항목은 netsh로 삭제 시 "Access is denied." 오류가 발생한다고 설명했습니다.

어쩔 수 없습니다. 저 설정을 지우기 위해 "netsh int ip reset"을 하는 것은 좀 그렇고, 그냥 유틸리티를 하나 만들기로 했습니다.

stjeong / Utilities / excludedportrange
; https://github.com/stjeong/Utilities/tree/master/excludedportrange

excludedportrange
; https://github.com/stjeong/Utilities/releases/

위의 바이너리를 다운로드해도 되고, 아래의 소스 코드를 직접 빌드해 사용해도 됩니다.

using System;
using System.IO;
using System.Net;
using System.Reflection;
using System.Runtime.InteropServices;

namespace excludedportrange
{
    class Program
    {
        [DllImport("Iphlpapi.dll")]
        internal static extern uint DeletePersistentTcpPortReservation(ushort startPort, ushort numberOfPorts);

        [DllImport("Iphlpapi.dll")]
        internal static extern uint DeletePersistentUdpPortReservation(ushort startPort, ushort numberOfPorts);

        static int Main(string[] args)
        {
            string mode;
            ushort startPort;
            ushort numberOfPorts;

            if (args.Length > 2)
            {
                mode = args[0];
                startPort = ushort.Parse(args[1]);
                ushort endPort = ushort.Parse(args[2]);

                if (startPort > endPort)
                {
                    Help();
                    return 0;
                }

                numberOfPorts = (ushort)(endPort - startPort + 1);
            }
            else
            {
                Help();
                return 0;
            }

            ushort portToDelete = (ushort)IPAddress.HostToNetworkOrder((short)startPort);

            int result = 0;
            Console.WriteLine($"{mode} Deleting... {startPort}:{numberOfPorts}");

            switch (mode)
            {
                case "tcp":
                    result = (int)DeletePersistentTcpPortReservation(portToDelete, numberOfPorts);
                    break;

                case "udp":
                    result = (int)DeletePersistentUdpPortReservation(portToDelete, numberOfPorts);
                    break;
            }

            Console.WriteLine(result);
            return result;
        }

        static void Help()
        {
            string appName = Path.GetFileName(Assembly.GetExecutingAssembly().Location);
            Console.WriteLine($"{appName} [tcp|udp] [startport] [endport]");
            Console.WriteLine($"ex)");
            Console.WriteLine($"\t{appName} tcp 15000 15550");
        }
    }
}

예를 들어, 다음과 같은 excludedportrange 설정이 있을 때,

C:\Windows\System32> netsh int ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
        80          80
      1241        1340
      1341        1440
      1565        1664
      1665        1764
      1955        2054
      2055        2154
      5357        5357
      8060        8060
     11735       11834
     11835       11934
     11935       12034
     15000       15000
     26974       27073
     27074       27173
     27174       27273
     44363       44363
     50000       50059     *

* - Administered port exclusions.

항목 중에서 "Start Port == 1341, End Port == 1440" 설정을 삭제하고 싶다면 다음과 같이 실행할 수 있습니다.

[관리자 권한으로 실행]

C:\temp> excludedportrange.exe tcp 1341 1440
tcp Deleting... 1341:100
0




참고로, DeletePersistentTcpPortReservation / DeletePersistentUdpPortReservation의 반환 값으로 1168(0x490: Element not found)이 나온다면?

StartPort의 인자가 "network byte order"이기 때문에 일반 포트 값을 그대로 사용하면 안 되고, C#의 경우라면 다음과 같은 식으로 변환한 후 사용해야 합니다.

ushort portToDelete = (ushort)IPAddress.HostToNetworkOrder((short)startPort);




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 4/13/2023]

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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11074정성태10/20/201629160Windows: 126. Windows Server 2016 평가판을 정식 버전으로 라이선스 변경하는 방법
11073정성태10/20/201625229.NET Framework: 613. 윈도우 데스크톱 응용 프로그램(예: Console)에서 알림 메시지(Toast notifications) 띄우기 [1]파일 다운로드1
11072정성태10/20/201621764VC++: 102. 새로 추가한 ATL COM 객체가 regsvr32.exe로 등록이 안 되는 문제
11071정성태10/20/201625312.NET Framework: 612. UWP(유니버설 윈도우 플랫폼) 앱에서 콜백 함수 내에서의 UI 요소 접근 방법 [1]
11070정성태10/20/201619550Windows: 125. 윈도우 서버 2016 마이그레이션
11069정성태10/19/201627221.NET Framework: 611. C++ 개발자들을 위한 C# Thread 동작 방식 [2]
11068정성태10/19/201630455Windows: 124. 윈도우 운영체제의 시간 함수 (5) - TSC(Time Stamp Counter)와 QueryPerformanceCounter [12]파일 다운로드1
11067정성태10/18/201626742Windows: 123. 윈도우 운영체제의 시간 함수 (4) - RTC, TSC, PM Clock, HPET Timer [2]
11066정성태10/17/201624395Windows: 122. 윈도우 운영체제의 시간 함수 (3) - QueryInterruptTimePrecise, QueryInterruptTime 함수파일 다운로드1
11065정성태10/15/201629825Windows: 121. 윈도우 운영체제의 시간 함수 (2) - Sleep 함수의 동작 방식 [1]
11064정성태10/14/201621530.NET Framework: 610. C# - WaitOnAddress Win32 API 사용파일 다운로드1
11063정성태10/14/201637647Windows: 120. 윈도우 운영체제의 시간 함수 (1) - GetTickCount와 timeGetTime의 차이점 [5]파일 다운로드1
11062정성태10/12/201618280오류 유형: 361. WCF .svc 호출 시 Could not find a base address that matches scheme net.tcp 예외
11061정성태10/12/201630419오류 유형: 360. IIS - 500.19 오류 (0x80070021)
11060정성태10/12/201622883오류 유형: 359. WCF - .svc 요청시 404 Not Found
11059정성태10/11/201627118.NET Framework: 609. WPF - 다중 스레드 환경에서 데이터 바인딩의 INotifyPropertyChanged.PropertyChanged에 대한 배려 [1]파일 다운로드1
11058정성태10/8/201622393개발 환경 구성: 303. Windows 10 Bash Shell - 한글 환경을 영문으로 바꾸고 싶다면?
11057정성태10/8/201617802오류 유형: 358. Windows 10 bash shell - sudo: unable to resolve host ...
11056정성태10/8/201620674개발 환경 구성: 302. Windows 10 bash shell 시작 시 [...] packages can be updated.
11055정성태10/8/201621721.NET Framework: 608. double 값을 구할 때는 반드시 피연산자를 double로 형변환! [6]
11054정성태10/5/201625704개발 환경 구성: 301. "Let's Encrypt" SSL 인증서를 Azure Cloud Services(classic)에 업데이트하는 방법
11053정성태10/5/201620444.NET Framework: 607. C# try/catch/finally의 IL 코드 표현
11052정성태9/27/201634620개발 환경 구성: 300. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 [7]파일 다운로드1
11051정성태9/25/201621774개발 환경 구성: 299. docker - c:\programdata\docker\windowsfilter 폴더 정리하는 방법파일 다운로드1
11050정성태9/24/201626517VC++: 101. 반올림하지 않고 double 변수 값 출력하는 방법 [3]
11049정성태9/24/201620924오류 유형: 357. 윈도우 백업 시 오류 - 0x81000037
... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...