2008-10-14 2 views
9

단일 콜백을 처리하고 Ruby에서 무료 TCP 포트를 찾는 데 도움이 필요한 use-once HTTP 서버를 만들려고합니다. Ruby를 사용하여 무료 TCP 서버 포트를 어떻게 찾을 수 있습니까?

무엇 내가 뭘의 골격이다

require 'socket' 
t = STDIN.read 
port = 8081 
while s = TCPServer.new('127.0.0.1', port).accept 
    puts s.gets 
    s.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n" + t 
    s.close 
    exit 
end 

(그것은 첫 번째 연결에 표준 입력을 반향하고 죽는다.)

내가 자동으로 청취 가능한 포트를 찾을 수있는 방법 에?

이것은 고유 한 작업 ID로 다시 호출하는 원격 서버에서 작업을 시작하는 유일한 방법 인 것 같습니다. 이 작업 ID는 상태 정보에 대해 질의 될 수 있습니다. 왜 원래 설계자는 결코 알지 못할 일을 계획 할 때 작업 ID를 반환 할 수 없었습니다. 다중 콜백과의 충돌이 발생할 수 있으므로 단일 포트를 사용할 수 없습니다. 이 방법으로 포트는 +5 초 동안 만 사용됩니다.

답변

-7

모든 포트> 5000을 순서대로 시도해 볼 수 있습니다. 그러나 당신이 듣고있는 포트는 클라이언트 프로그램과 어떻게 통신 할 것입니까? 다른 환경 사이에서 스크립트를 이동해야하는 경우 포트를 결정하고 쉽게 구성 할 수 있습니다. HTTP의 경우

는 표준 포트는 80 대체 내가 본 사용했습니다 포트 8080, 880 및

+0

(마지막) 질문의 마지막 단락을 참조하십시오. –

+1

이것은 허용 된 대답이 아니어야합니다. 아래 http://stackoverflow.com/a/201528/3528을 참조하십시오. –

-6

8000 임의의 포트에서 통신을하지 마십시오입니다이다. 기본 설정을 선택하고 구성 가능하게 만드십시오. 무작위 포트는 방화벽과 호환되지 않습니다. FTP는이를 수행하고이를위한 방화벽 지원은 악몽입니다. ​​패킷을 깊이 검사해야합니다.

+3

질문은 무작위 포트를 사용하는 것이 좋은지 아닌지, 사용할 무료 포트를 찾는 방법이었습니다. – ZombieDev

+0

모든 TCP/IP 트래픽이 방화벽을 통과하는 것은 아닙니다. –

3

사실은 한 줄에 모든 일을하려고하지 않을 때 매우 쉽습니다 : -/

이 수행
require 'socket' 
t = STDIN.read 

port = 8080 # preferred port 
begin 
    server = TCPServer.new('127.0.0.1', port)  
rescue Errno::EADDRINUSE 
    port = rand(65000 - 1024) + 1024 
    retry 
end 

# Start remote process with the value of port 

socket = server.accept 
puts socket.gets 
socket.print "HTTP/1.1 200/OK\rContent-type: text/plain\r\n\r\n" + t 
socket.close 

(강한 단어) 질문의 조각 같은.

+4

그냥 선택하십시오 ... 무작위로 선택하는 것은 무한 루프이며 이론적으로 서버에서 정의되지 않은 시간 동안 실행할 수 있습니다. 이미 사용중인 포트가 많을수록 상황이 악화됩니다. –

64

포트 번호로 0을 전달하십시오. 이렇게하면 시스템에서 임시 포트 범위를 벗어난 포트를 선택하게됩니다. 일단 서버를 생성하면 서버가 바인드 된 포트를 포함하는 addr을 요청할 수 있습니다.

server = TCPServer.new('127.0.0.1', 0) 
port = server.addr[1] 
+0

나는'addr' 메소드가없는 기본 소켓 (TCPSocket 아님)을 사용하고 있습니다. 이 사건에서 내가 어떻게 항구를 얻을 수 있는지 알아? – troelskn

+3

내 질문에 답하면'socket.getsockname.unpack ("snA *") [1]' – troelskn

관련 문제