programing

로컬 호스트에서 사용 가능한 포트 번호를 선택하려면 어떻게 해야 합니까?

oldcodes 2023. 6. 8. 22:31
반응형

로컬 호스트에서 사용 가능한 포트 번호를 선택하려면 어떻게 해야 합니까?

프로세스 간 통신을 사용하려고 하는데 Windows에서 명명된 파이프를 사용하는 방법을 찾을 수 없어서 네트워크 소켓을 사용하려고 했습니다.모든 것은 지역적으로 발생합니다.서버는 별도의 프로세스에서 슬레이브를 시작할 수 있으며 일부 포트에서 수신합니다.노예들은 그들의 일을 하고 그 결과를 주인에게 제출합니다.사용 가능한 포트를 확인하려면 어떻게 해야 합니까?80번이나 21번 포트에서는 들을 수 없나요?

저는 파이썬을 사용하고 있습니다. 선택의 폭이 줄어들면요.

특정 포트에 바인딩하지 마십시오.대신 포트 0에 바인딩합니다.

import socket
sock = socket.socket()
sock.bind(('', 0))
sock.getsockname()[1]

그런 다음 OS가 사용자를 위해 사용 가능한 포트를 선택합니다.다음을 사용하여 선택한 포트를 가져올 수 있습니다.sock.getsockname()[1]노예들에게 넘겨서 그들이 다시 연결될 수 있도록 합니다.

sock사용자가 생성하고 반환한 소켓입니다.socket.socket.

위에서 설명한 내용에 대한 토막글을 위해:

import socket
from contextlib import closing

def find_free_port():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(('', 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]

소켓을 포트 0에 바인딩합니다.1024에서 65535 사이의 임의의 사용 가능한 포트가 선택됩니다.다음을 사용하여 선택한 포트를 검색할 수 있습니다.getsockname()바로 뒤에bind().

나중에 사용할 수 있는 빈 포트만 찾으면 되는 경우, 소켓 서버를 사용하여 이전 답변과 비슷하지만 더 짧은 내용이 있습니다.

import socketserver

with socketserver.TCPServer(("localhost", 0), None) as s:
    free_port = s.server_address[1]

포트의 사용 가능 여부는 보장되지 않으므로 이 스니펫과 코드를 사용하여 루프에 넣어야 할 수도 있습니다.

원하는 포트에서 수신할 수 있습니다. 일반적으로 사용자 애플리케이션은 포트 1024 이상(65535를 통해)을 수신해야 합니다.청취자 수가 다양한 경우 주요 기능은 앱에 범위(예: 20000-21000)를 할당하고 예외를 포착하는 것입니다.이렇게 하면 컴퓨터에서 포트를 사용할 수 없는 경우(다른 프로세스에서 사용하는 경우) 알 수 있습니다.

그러나 이 경우 바인딩이 실패할 경우 오류 메시지를 인쇄하는 한 수신기에 하드 코딩된 단일 포트를 사용하는 데 문제가 없습니다.

또한 대부분의 소켓(슬레이브용)을 특정 포트 번호에 명시적으로 바인딩할 필요는 없습니다. 수신 연결을 기다리는 소켓(여기의 마스터처럼)만 수신기로 만들어 포트에 바인딩하면 됩니다.사용하기 전에 소켓에 대해 포트가 지정되지 않은 경우 OS는 소켓에 사용 가능한 포트를 할당합니다.마스터가 데이터를 보내는 슬레이브에 응답하려고 할 때 수신기가 데이터를 수신할 때 발신인의 주소에 액세스할 수 있습니다.

당신은 이것을 위해 UDP를 사용할 것이라고 생각합니까?

언급URL : https://stackoverflow.com/questions/1365265/on-localhost-how-do-i-pick-a-free-port-number

반응형