1

我创建了一个接收套接字,使用 nanomsg 库并尝试发送nn_recv()消息,如下代码所示:

recv_bytes = nn_recv ( socket_id, &buf, NN_MSG, 0 );

recv_bytes< 0 时,我执行以下操作:

    if ( recv_bytes <= 0) {

         struct nn_polld pfd[1] ;
        
         pfd[0].fd = socket_id;
         pfd[0].events = NN_POLLIN;
            
         rc = nn_poll ( pfd, 1, 2000 );

         if ( rc == 0 ) {
              printf ( "Timeout!" );
           // exit (1);
         }

         if ( rc == -1 ) {
              printf ( "Error!" );
           // exit (1);
         }
            
         if ( pfd [0].revents & NN_POLLIN ) {
              printf ( "Message can be received from s1!" );
           // exit (1);
         }
    }

我根本看不到Error!文字,我总是看到其他打印,但在我重新绑定到套接字之前没有收到任何消息。

我想知道是否有任何方法可以让我通过错误NN_POLL并再次重新连接/绑定。问题是我不想在计时器上随机做。

请建议。

当一个终端站关闭时,我无法接收来自终端的消息。如果我知道 nanomsg 套接字已经坏了,那么我可以重新绑定但没有收到任何错误,同时也没有收到来自其他终端站的消息。

4

1 回答 1

0

问: “我想知道是否有任何方法可以让我出错NN_POLL并再次重新连接/绑定。”

答:
首先,欢迎来到信令和消息传递领域。Nanomsg 是 Martin Sustrik 的聪明小孩子,Martin Sustrik 是 ZeroMQ 系统的共同之父。最初的 Zen-of-Zero(你总是可以在其他地方阅读更多关于这些核心思想和传播的信息)让 Martin 在设置时更进一步——所以如果 ZeroMQ 花费的零步数超过了满足其所必需的ZMTP-RFC 规范并且仍然是智能和可扩展的,nanomsg 试图在自己的理由上花费更少 - 长话短说 - 不要期望 ZeroMQ 和, 在任何事情上花费一个 CPU-tick,而不是通过 API 记录和“约定”发生的事情(作为交换,拥有终极性能、可扩展性和最小延迟是一件艺术品,对我们来说是一笔慷慨的交易,普通代码凡人,不是吗?)。


我们能做什么?

让我们从 Documented API 开始:

...
成功完成后,nn_pollfds返回带有事件信号的结构的数量。如果超时,则返回值为 0。如果发生错误,则返回 -1,并将errno其设置为以下值之一。

错误

EBADF
某些提供的套接字无效。
EINTR
在发送消息之前,操作因传递信号而中断。
ETERM
库正在终止。

-1鉴于此,errno如果至少有一个记录在案的事件发生(层次结构是不言自明的)
(a)
您的代码端基础设施节点已经检测到(自我)终止,您就可以公平地期望收到继续进行,或

(b)
在非 (a) 的情况下,代码端 -node 已被 O/S- 或 USR-SIGNAL 中断(并且服从它,它在没有完成工作的情况下返回 - self - 报告您的代码,它被中断),或

(c)
在 not-(a) && not-(b) 的情况下,当您的代码要求 -node 操作非 - 套接字(或 O/S 套接字文件句柄),所以它这样做

在所有其他情况下,返回的值永远不会是,{ 0 | n_events }因此永远不会{ -1 }

一些援助可能来自nn_get_statistic ( aSock, anOptionCODE )

...
NN_STAT_ESTABLISHED_CONNECTIONS从此套接字启动的成功建立的连接数。
NN_STAT_ACCEPTED_CONNECTIONS此套接字接受的成功建立的连接数。
NN_STAT_DROPPED_CONNECTIONS此套接字丢弃的已建立连接数。
NN_STAT_BROKEN_CONNECTIONS此套接字关闭的已建立连接的数量,通常是由于协议错误。
NN_STAT_CONNECT_ERRORS此套接字尝试连接到远程对等点时遇到的错误数。
NN_STAT_BIND_ERRORS此套接字尝试绑定到本地地址时遇到的错误数。
NN_STAT_ACCEPT_ERRORS此套接字尝试接受来自远程对等方的连接时遇到的错误数。
NN_STAT_CURRENT_CONNECTIONS当前与此套接字建立的连接数。
NN_STAT_MESSAGES_SENT此套接字发送的消息数。
NN_STAT_MESSAGES_RECEIVED此套接字接收到的消息数。
NN_STAT_BYTES_SENT此套接字发送的字节数。
NN_STAT_BYTES_RECEIVED此套接字接收的字节数。
...

然而,这些 API 提供的细节的实际设计和应用程序代码决策是你的

于 2022-02-26T19:01:50.547 回答