1

標準net/rpc機能を使用するGoで、インバウンドRPC要求の送信元のIPアドレスを確認したいと思います。基盤となるhttp機能はhttp.Requestオブジェクトでこれを提供しているように見えますが、デフォルトのRPCハンドラー(を使用して設定)からそれを取得する方法がわかりませんrpc.HandleHTTP

基盤となるものに到達するための隠されたメカニズムはありますかhttp.Request、それとも別のHTTPレスポンダーを設定することでもっと凝ったことをする必要がありますか?

4

4 に答える 4

4

私の知る限り、デフォルト サーバーのどこかからアドレスを取得することはできません。

リクエスト受信関数を呼び出すサービスコールメソッドでは、コーデックに格納されたリモートデータへのアクセスは提供されません。

http ハンドラーを 2 回登録できる場合 (これはできませんDefaultRPCPath)、 HTTP ハンドラー セットアップの を で上書きした可能性がありますHandleHTTP。しかし、今日ではそれは不可能です

大騒ぎせずにできることは、独自のServeHTTP方法でデフォルトの RPC サーバーに基づいて RPC サーバーを構築することです。

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...
}

もちろん、これの欠点は、もう使用できないことですrpc.Register。あなたは書く必要がありますsrv.Register

編集:自分HandleHTTPでも書く必要があることを忘れていました。この理由は、RPC サーバーを埋め込んで記述srv.HandleHTTPした場合、組み込みインスタンスで呼び出され、組み込みインスタンスを に渡し、http.Handle()独自の の定義を無視するためですServeHTTPこれには、サーバーがアクセスできないプライベート デバッグ ハンドラ( ) をHandleHTTP使用するため、デバッグ パスを使用して RPC サーバーをデバッグすることができないという欠点があります。rpc.debugHTTP

于 2012-09-28T13:51:35.253 に答える
1

パッケージは、net/rpctcp や http よりも高いレベルの抽象化です。複数のコーデックを使用できるため、着信 rpc の IP アドレスを取得する方法を提供しても意味がありません。理論的には、代わりに unix ソケットで、または無線送信機を使用して通信するコードを誰かが実装できる可能性があります。

トランスポート層の詳細にアクセスしたい場合は、スタック内のレベルをドロップし、netまたはnet/httpディレクトリを使用して rpc サービスを作成する必要があります。

于 2012-09-28T01:47:38.557 に答える
1

net/rpc の代わりにhttps://github.com/valyala/gorpcを使用することもできます。これは、クライアント アドレスを RPC サーバー ハンドラーに渡します。詳細については、http: //godoc.org/github.com/valyala/gorpc#HandlerFuncを参照してください。 .

于 2015-03-01T13:21:01.223 に答える
0

現在、rpc 関数でこれを行う方法はないようです。詳細については、このリンクを参照してください

ここに要約があります。

Q:

現在、RemoteAddr() メソッドを呼び出して、クライアントがサーバーにダイヤルするときに net.Conn でのみ RPC クライアントのアドレスを取得できますが、サーバーに複数のクライアントが接続されており、このクライアントのそれぞれが RPC エクスポート メソッドを呼び出しているとします。RPC メソッド内から発信者のリモート アドレスを取得するメソッドを実装する方法はありますか?

func (t *Type) Method(args *Args, reply *string) error {
//
*reply = Caller.RemoteAddr().String()のようなもの
// 今メソッドを呼び出したのは誰?
ゼロを返す
}

A:

私は懐疑的です。これを提供するには、API を変更する必要があります (必ずしも下位互換性がないというわけではありませんが、多少の再設計が必要です)。

于 2016-03-08T06:11:17.763 に答える