내가 아는 한 기본 서버의 어딘가에서 주소를 가져올 수 없습니다.
요청 수신 기능을 호출하는 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 서버를 디버깅 할 수없는 단점이 있습니다.
왜 IP 주소를 원하십니까? –
@JeremyWall 로깅/디버깅 목적으로 필요하며 뭔가 무결성 검사를하는 것도 좋습니다. – fluffy