1

zmq_socket_monitorサービスを使用して、スレッドスポーンメソッドを使用してZMQ_REPソケットを監視しています。しかし、私が知る限り、このサービスはINPROCでのみ機能し、リモートマシン内では機能しません。

 My Main code:
    void *ctx = zmq_init (1);
    void *rep = zmq_socket (ctx, ZMQ_REP);
    int rc = zmq_socket_monitor (rep, "inproc://monitor.req", ZMQ_EVENT_ALL);

My Thread Code:
    void rep_socket_monitor (void *ctx)
    {
    zmq_event_t event;
    void *s = zmq_socket (ctx, ZMQ_PAIR);
    rc = zmq_connect (s, "inproc://monitor.req");
    while (true) 
    {
        zmq_msg_t msg;
        rc = zmq_recvmsg (s, &msg, 0);
        memcpy (&event, zmq_msg_data (&msg), sizeof (event));
        switch (event.event)
        {
          //Check for events
        }
    }
    }

ここでイベントをチェックすると、自分のマシンの監視されたアドレスを取得します。リモートマシンクライアントが私に接続しようとした場合はどうなりますか。監視しているポートに接続されたときにIPアドレスを取得するにはどうすればよいですか。

4

2 に答える 2

0

監視ソケットを、それ自体がエンドポイントにバインドされていないREP ソケットに接続しているため、外部関係者が接続できるエンドポイントがありません。

あなたの場合、例えば:

void *ctx = zmq_init (1);
void *rep = zmq_socket (ctx, ZMQ_REP);
int rc = zmq_socket_monitor (rep, "inproc://monitor.req", ZMQ_EVENT_ALL);
// Create thread, check error messages...
...
// Bind the REP socket to your external endpoint
rc = zmq_bind (rep, myExternalEndPoint);

設定方法の例については、zmq_socket_monitor API ドキュメント(バージョン 3.2.2 用) を参照してください。

注意事項:

この初期実装では、接続指向 (tcp および ipc) トランスポートのみがサポートされています。

ZMQ_EVENT_CONNECTED: 接続が確立されまし
た。ZMQ_EVENT_CONNECTED イベントは、リモート ピアへの接続が確立されたときにトリガーされます。これは、同期または非同期のいずれかで発生する可能性があります。

于 2013-02-20T20:15:04.000 に答える
0

モニター ソケットから読み取られるメッセージには、次の 2 つのフレームがあります。

  • イベント番号(16bit)+イベント値(32bit)
  • TCP および IPC の影響を受けるエンドポイントの名前

ドキュメントには明示的に記載されていませんが、エンドポイントはソケットのローカルエンドポイント、つまりバインドされている ip/port を参照しています。リモートエンドポイント (接続するピアの IP/ポート)を取得するには、まず接続ファイル記述子 (ZMQ_EVENT_CONNECTED イベントのイベント値) が必要です。次に、取得した fd で getpeername を次のように呼び出します。

std::string getPeerName(int socketFd) {
    sockaddr_storage sockaddrStore;
    socklen_t len = sizeof(sockaddrStore);

    sockaddrStore.ss_family = AF_UNSPEC;
    getpeername(socketFd, (sockaddr*)&sockaddrStore, &len);

    if (sockaddrStore.ss_family == AF_INET) {
        char addrstr[INET_ADDRSTRLEN];
        sockaddr_in* sockaddrin = (sockaddr_in*)&sockaddrStore;

        inet_ntop(AF_INET, &sockaddrin->sin_addr, addrstr, INET_ADDRSTRLEN);
        return std::string("tcp://") + addrstr;
    }

    return "<unknown>";
}
于 2017-02-14T09:55:40.433 に答える