프로세스 간 통신을 시도하고 있는데 Windows에서 명명 된 파이프를 사용하는 방법을 알 수 없었기 때문에 네트워크 소켓을 사용할 것이라고 생각했습니다. 모든 것이 로컬에서 발생합니다. 서버는 별도의 프로세스에서 슬레이브를 시작할 수 있으며 일부 포트에서 수신 대기합니다. 노예들은 일을하고 그 결과를 주인에게 제출합니다. 사용 가능한 포트를 어떻게 알 수 있습니까? 포트 80이나 21에서들을 수 없다고 생각합니까?
선택 사항이 줄어들면 Python을 사용하고 있습니다.
감사!
답변
특정 포트에 바인딩하거나 포트 0에 바인딩하지 마십시오 sock.bind(('', 0))
. 그러면 OS가 사용 가능한 포트를 선택합니다. 를 사용하여 선택한 포트를 가져 와서 sock.getsockname()[1]
다시 연결할 수 있도록 슬레이브에 전달할 수 있습니다.
답변
위에서 설명한 내용의 일부를 위해 :
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()
.
답변
원하는 포트에서들을 수 있습니다. 일반적으로 사용자 응용 프로그램은 포트 1024 이상 (65535를 통해)을 수신해야합니다. 리스너 수가 가변적 인 경우 가장 중요한 것은 앱에 범위 (예 : 20000-21000 및 CATCH EXCEPTIONS )를 할당하는 것 입니다. 이것이 컴퓨터에서 포트를 사용할 수 없는지 (다른 프로세스에 의해 사용됨) 알 수있는 방법입니다.
그러나 귀하의 경우에는 바인딩이 실패 할 경우 오류 메시지를 인쇄하는 한 리스너에 대해 단일 하드 코딩 된 포트를 사용하는 데 문제가 없어야합니다.
또한 대부분의 소켓 (슬레이브 용)은 특정 포트 번호에 명시 적으로 바인딩 할 필요가 없습니다. 들어오는 연결을 기다리는 소켓 (예 : 여기서 마스터) 만 리스너로 만들어 포트에 바인딩해야합니다. 포트가 사용되기 전에 소켓에 대해 지정되지 않은 경우 OS는 사용 가능한 포트를 소켓에 할당합니다. 마스터가 데이터를 전송하는 슬레이브에 응답하고자 할 때 리스너가 데이터를 수신 할 때 발신자의 주소에 액세스 할 수 있습니다.
나는 당신이 이것을 위해 UDP를 사용할 것이라고 생각합니까?
답변
나중에 사용하기 위해 사용 가능한 포트만 찾아야하는 경우 이전 답변 과 비슷 하지만 socketserver를 사용하는 더 짧은 스 니펫이 있습니다 .
import socketserver
with socketserver.TCPServer(("localhost", 0), None) as s:
free_port = s.server_address[1]
포트가 무료로 유지된다는 보장은 없으므로이 스 니펫과이를 사용하는 코드를 루프에 넣어야 할 수도 있습니다.