2017-04-15 1 views
8

포트 8080에서 수신 대기하는 간단한 웹 서버를 작성했습니다.하지만 하드 코드 된 포트 번호는 사용하고 싶지 않습니다. 내가 원하는 것은 내 서버가 사용 가능한 포트에서 수신 대기한다는 것입니다. 그리고 내 웹 서버가 듣고있는 포트 번호를 알고 싶습니다.http.ListenAndServe에서 다음 사용 가능한 포트를 사용하는 방법

내 코드를 넣고 주어진다 :

package main 

import (
    "net/http" 
) 

func main() {  
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil) 

} 

답변

20

당신은 당신이 정확한 포트를 지정하지 않을 그러나 당신이 시스템에 의해 선택 무료로 사용 가능한 포트 원하는 나타 내기 위해 포트 0을 사용할 수 있습니다 :

http.ListenAndServe(":0", nil) 

문제는 할당 된 포트를 찾을 수 없다는 것입니다. 당신이 볼 수 있듯이

Using port: 42039 

, 당신은 할당 된 포트에 액세스 할 수 있습니다

listener, err := net.Listen("tcp", ":0") 
if err != nil { 
    panic(err) 
} 

fmt.Println("Using port:", listener.Addr().(*net.TCPAddr).Port) 

panic(http.Serve(listener, nil)) 

예 출력 : 그래서 당신은 http.Serve()에 전달할 수동으로 net.Listener 자신합니다 (net.Listen() 기능을 사용)를 작성하고, 필요 net.Listener, 그 net.Addr 주소 (해당 Addr() 메서드에 의해 획득 됨). net.Addr 직접 포트에 대한 액세스를 제공하지 않지만, 우리는 net.Listenertcp 네트워크 스트림을 이용하여 생성되므로, net.Addr는 구조체이며 필드 Port int을 갖는다 (우리는 type assertion으로 획득 할 수있다) 동적 유형 *net.TCPAddr,이 될 것이다.

응용 프로그램에서 포트가 필요하지 않은 경우 (예 : 직접 표시하려는 경우) 형식 어설 션이 필요하지 않은 경우 listener.Addr() (포트 번호 포함)을 인쇄 할 수 있습니다 말) :

fmt.Println("Address:", listener.Addr()) 

예 출력 :

Address: [::]:42039 

또한이 경우 (http.ListenAndServe()) 반환 오류를 처리하는 것을 잊지 마세요. 나의 예에서는 모든 것이 잘되면 http.LitenAndServe()http.Serve() 블록을 차단하기 때문에 단순히 panic()으로 전달했습니다. 따라서 오류가있는 경우에만 반환됩니다. 이는 panic()으로 전달됩니다.

+1

매우 잘 설명해 주셔서 감사합니다. –

관련 문제