2017-09-18 1 views
1

서버에 연결하려고하는 클라이언트가 있습니다.Go에서 net.Dial 호출을 중단하는 방법?

클라이언트를 종료하고이 다이얼 시도를 중단 할 수 있어야합니다. 이것이 가능한가 ? 내가 어떻게 할 수 있니?

다이얼 호출이 실패하지 않은 상태에서 30 초가 경과 할 때까지 테스트가 차단 된 이후로 시간 초과가 30 초보다 명백하게 길어졌습니다.

타임 아웃을 지정할 수 있습니까?

+0

하십시오 context.Context

func DialTimeout(network, address string, timeout time.Duration) (Conn, error) { d := Dialer{Timeout: timeout} return d.Dial(network, address) } 

그리고 예 :

당신은 DialTimeout을 참조 할 수 있습니다

는 설치하는 방법의 기본 다이얼러 볼 수 다른 비 시간 기반 상황으로 인해 취소하고 싶습니까? – Sascha

+0

https://blog.golang.org/context 패키지를 보셨습니까? –

+0

문서에 따르면 컨텍스트는 요청 처리를위한 것이며 우리는 취소 할 수 있어야하거나 시간 제한이 있습니다. 내 응용 프로그램은 요청 처리기가 아닙니다. 내 응용 프로그램에는 여러 가지 동시 실행 클라이언트가 다른 이동 루틴에서 실행됩니다. 일련의 이동 루틴을 종료 할 수있는 컨텍스트의 고유 한 변형을 구현했습니다. 다이얼 시도에 고정 된 goroutine을 제외하고 이것은 잘 작동합니다. 일반적으로 unix에서는 원격 서버가 없으면 연결 시도가 오래 가지 않습니다. Go에서 30 초 이상 지속될 솔기가 있습니다. 다이얼 시도에서 차단 된 이동 루틴을 종료하려면 어떻게해야합니까? – chmike

답변

7

net.Dialer은 및 Deadline 필드를 가지며, 시간 제한 및 취소를 허용하는 DialContext의 컨텍스트를 사용할 수도 있습니다. 당신은 다른 시간 제한 또는를 제공하는 방법을 찾고

var d Dialer 
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 
defer cancel() 

return d.DialContext(ctx, network, address) 
+0

우수. 그것이 내가 찾고 있던 것입니다. 나는 개요에서 주어진 예제를 사용하고 있었다. 'conn, err : = net.Dial ("tcp", "golang.org:80")'. 나는 올바른 곳을 보지 않았다. – chmike

관련 문제