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 回答