我可以寄到tcp://*:3000
吗?
是的。
我可以将订阅者绑定到该地址吗?
是的。当然,一个人必须拥有自己的集合(显然不能“共享”任何专有资源)
但是,
必须使用正确配置的-s ( -s )PUB
来“编织” ,以便覆盖所有那些远程访问点,它不需要自己知道。.connect()
nng_dial()
使用反向的自由.bind()/.connect()
是 ZeroMQ 和 nanomsg 的常见做法,但请检查nng是否保持这种选择自由。
...想先用 pubsub 进行测试。发送者将使用什么作为发送到 tcp发送到多个客户端的 URL?
好吧,如果刚从 ZeroMQ / nanomsg / nng 开始,事情似乎有点令人困惑。
首先:
初始zeromq API v2.x 和nng都不会只发送给多个客户端,而是始终发送给Socket 原型引擎可见的所有客户端(可能的配置调整细节超出了本文的范围)。
换句话说,PUB
-side 应用程序代码根本不决定谁将收到消息。一旦看到所有客户端都在“交付列表”上,网络将不得不将所有副本传送到所有此类客户端,这些客户端能够进行临时连接(有些更快,有些晚,其余的人再也看不见了是一个单独的音乐会 - 也不是您的问题,如您之前的问题中所述)。
订阅机制是这里的PUB/SUB
一个重要问题。nng和早期的zeromq v2.x 都执行延迟的订阅 TOPIC 过滤,并且它实际上发生在每条消息被传递到远程客户端时,以远程 {PASS|FAIL} 拒绝为代价,基于该远程客户端订阅的主题。因此,所有消息都按设计流向所有客户端。
这意味着,您的网络级通信多播实际上对这种类型的本地(仅)网络没有任何好处(如您在上一个问题中发布的那样)PUB/SUB
可扩展的正式通信模式原型。到目前为止, nng还没有发布来支持这种传输类的实现(而zeromq有)。
下一篇:
看来,对[ ZeroMQ 层次结构在不到五秒的时间内] 部分的主要概念差异进行简短阅读可能有助于消除乐高式基础设施设置的术语和概念:
代码显然是示意性的,不完整的,但可以阅读和理解:
// PUB_sender( "<tcp4>://<A.B.C.D>:<PORT>" ); // will launch it
// <tcp6>://[::1]:<PORT>
// <tls+tcp4>://<___aTransportClass_specific_AccessPoint_ADDRESS_>:<_aTransportClass_spcific_AccessPoint_SPECIFIER>
//
// -------------------------------------------------------------------
// SUB_client( "..." ); // anyone ( all ) who will "dial-in" will receive messages
#define PUT64( ptr, u ) \
do { \
(ptr)[0] = (uint8_t)(((uint64_t)(u)) >> 56); \
(ptr)[1] = (uint8_t)(((uint64_t)(u)) >> 48); \
(ptr)[2] = (uint8_t)(((uint64_t)(u)) >> 40); \
(ptr)[3] = (uint8_t)(((uint64_t)(u)) >> 32); \
(ptr)[4] = (uint8_t)(((uint64_t)(u)) >> 24); \
(ptr)[5] = (uint8_t)(((uint64_t)(u)) >> 16); \
(ptr)[6] = (uint8_t)(((uint64_t)(u)) >> 8); \
(ptr)[7] = (uint8_t)((uint64_t)(u)); \
} while (0)
int
PUB_sender( const char *aTransportClassAccessPointURL )
{
int aRetVAL = -1;
nng_socket aSOCKET = NNG_SOCKET_INITIALIZER;
// ---------------------------------aSOCKET = Context().socket( PUB );
if ( ( aRetVAL = nng_pub0_open( &aSOCKET )
) != 0 ) fatal( "nng_pub0_open",
aRetVAL
);
// ---------------------------------aSOCKET.bind( aTransportClassAccessPointURL );
if ( ( aRetVAL = nng_listen( aSOCKET,
aTransportClassAccessPointURL,
NULL,
NNG_FLAG_NONBLOCK
)
) != 0 ) fatal( "nng_listen",
aRetVAL
);
// ---------------------------------aSOCKET.setsockopt( LINGER, 0 );
if ( ( aRetVAL = nng_setopt_int( aSOCKET,
NNG_OPT_LINGER,
0
)
) != 0 ) fatal( "nng_setopt_int",
aRetVAL
);
for (;;)
{
char * aBUF = "12345678";
uint64_t aVAL;
time_t aNOW;
aNOW = time( &aNOW ); printf( "PUB.send()-s: "); showdate( aNOW );
PUT64( aBUF, (uint64_t) aNOW );
// ----------------------------aSOCKET.send( aBUF, ... );
if ( ( aRetVAL = nng_send( aSOCKET,
aBUF,
sizeof( aBUF ),
NNG_FLAG_ALLOC
)
) != 0 ) fatal( "nng_send",
aRetVAL
);
}
nng_free( aBUF, 8 );
nng_close( aSOCKET );
}