2012-09-27 6 views
1

표준 net/rpc 기능을 사용하는 Go에서 인바운드 RPC 요청의 출처를 확인하고 싶습니다. 기본 http 기능은 http.Request 개체에이 기능을 제공하는 것으로 보이지만 기본 RPC 처리기 (rpc.HandleHTTP을 사용하여 설정)에서 해당 기능을 얻는 방법이 없습니다.RPC 호출에서 요청자의 IP 주소 확인

기본이되는 http.Request에 접근하기위한 숨겨진 메커니즘이 있습니까? 아니면 다른 HTTP 응답기를 설정해야 할 필요가 있습니까?

+0

왜 IP 주소를 원하십니까? –

+0

@JeremyWall 로깅/디버깅 목적으로 필요하며 뭔가 무결성 검사를하는 것도 좋습니다. – fluffy

답변

1

net/rpc 패키지는 tcp 또는 http보다 추상화 수준이 높습니다. 여러 코덱을 사용할 수 있기 때문에 인바운드 rpc의 IP 주소를 가져 오는 방법을 제공하는 것이 바람직하지 않습니다. 이론적으로 유닉스 소켓 대신에 또는 무선 송신기를 사용하는 코드를 구현할 수 있습니다.

전송 계층의 특성에 액세스하려면 스택에 레벨을 드롭하고 net 또는 net/http 디렉토리를 사용하여 rpc 서비스를 만들어야합니다.

+0

나는 더 높은 추상화 수준에 있다고 생각했지만 기본 전송 메커니즘에 도달 할 수있는 인터페이스가 존재할 이유가 없습니다. 아마도 현재 API는 핸들러의 스텁 typename의 인터페이스가 미래의 인터페이스가 될지라도, 미래의 고리를 제공하지는 못하는 것 같습니다. – fluffy

3

내가 아는 한 기본 서버의 어딘가에서 주소를 가져올 수 없습니다.

요청 수신 기능을 호출하는 service call method은 코덱에 저장된 원격 데이터에 대한 액세스를 제공하지 않습니다.

HTTP 처리기를 두 번 등록 할 수있는 경우 (which they can't) HTTP 처리기 설정에 대해 DefaultRPCPath을 덮어 쓸 수 있습니다 (HandleHTTP). 그러나 그것은 단지 not possible today입니다. '당신이 할 수있는,

import (
    "log" 
    "net" 
    "net/http" 
    "net/rpc" 
) 

type myRPCServer struct { 
    *rpc.Server 
} 

func (r *myRPCServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { 
    log.Println(req.RemoteAddr) 
    r.Server.ServeHTTP(w, req) 
} 

func (r *myRPCServer) HandleHTTP(rpcPath, debugPath string) { 
    http.Handle(rpcPath, r) 
} 

func main() { 
    srv := &myRPCServer{rpc.NewServer()} 
    srv.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath) 

    // ...http listen code... 
} 

이것의 단점은 물론이다

당신이 할 수있는 일, 많은 소란하지 않고, 자신의 ServeHTTP 방법으로 기본 하나를 기반으로 RPC 서버를 구축하는 것입니다 더 이상 rpc.Register을 사용하십시오. srv.Register을 작성해야합니다.

편집 :HandleHTTP도 직접 작성해야한다는 것을 잊었습니다. 그 이유는 RPC 서버를 임베드하고 srv.HandleHTTP이라고 작성하면 임베디드 인스턴스가 http.Handle()으로 전달되고 임베디드 인스턴스는 ServeHTTP이라는 자체 정의를 무시합니다. 서버의 HandleHTTP은 액세스 할 수없는 private debug handler (rpc.debugHTTP)을 사용하기 때문에 디버그 경로를 사용하여 RPC 서버를 디버깅 할 수없는 단점이 있습니다.

+0

이것은 좋은 접근 방법처럼 보입니다. 그리고 내가 생각한 것의 종류가 필요할 것입니다. 나는 가야 할 새내기인데, 조각들을 함께 맞추기까지 약간의 시간이 걸릴 수도 있습니다. – fluffy

0

현재 rpc 기능에서이 작업을 수행 할 방법이없는 것 같습니다. 자세한 내용은 link을 참조하십시오.

다음은 요약입니다.

Q : 지금 RemoteAddr() 메소드 만 그물에 RPC 클라이언트의 주소를 얻기 위해 호출 할 수 있습니다

.클라이언트가 서버에 전화를 걸 때 서버에 여러 클라이언트가 연결되어 있고 각 클라이언트가 RPC 내 보낸 메서드를 호출한다고 가정합니다. RPC 내부에서 호출자의 원격 주소를 가져 오는 방법을 구현하는 방법이 있습니까?

FUNC (t의 * 형) 방법 (인수 * 인수, 응답 * 문자열) 오류 {
// 뭔가 같은
* 답변 = Caller.RemoteAddr(). 문자열()
// 방법이라는 사람 지금?
반환

A}
전무 :

나는 회의적이다. 이것을 제공하기 위해서는 API 변경이 필요합니다 (반드시 호환되지 않는 하나의 은 아니지만 여전히 약간의 재 설계가 필요합니다).