ZeroMQ无法设置ZMQ_RATE - 无效参数(使用EPGM或PGM多播)

时间:2016-06-30 17:10:32

标签: zeromq multicast

我无法在ZMQ_RATE组播套接字上将 ZeroMQ (默认值设置为非常低的100 kbits / sec)设置为最大速率 - 调用{{1失败(使用zmq_setsocketopt() langauge)。

由于我的应用程序涉及流媒体视频,因此我需要更高的费率。

任何人都可以对此发光 - 这是用于复制问题的精简代码

C

以上的输出是:

void* _context;
void* _responder;

_context    = zmq_ctx_new ();
_responder  = zmq_socket ( _context, ZMQ_SUB );

int64_t val = 100000;
int rc;

rc          = zmq_setsockopt( _responder, ZMQ_RATE, &val, sizeof(int64_t) );
int ze2     = zmq_errno ();

int           major,  minor,  patch;
zmq_version( &major, &minor, &patch );

printf( "DIAG[zmq_setsockopt() API:%d.%d.%d] RC: (%d) ~ Errno: (%d) ~ Error:(%s)\n",
        major,
        minor,
        patch
        rc,
        ze2,
        zmq_strerror( ze2 )
        );

如果我将套接字类型更改为 DIAG[zmq_setsockopt() API:4.0.4] RC: (-1) ~ Errno: (22) ~ Error: (Invalid argument) ,我也会收到错误。
已经测试了不同顺序或数量级别的1到100000之间的许多费率,但都失败了。

版本是在Windows 7上运行的4.0.4

1 个答案:

答案 0 :(得分:0)

API

zmq_setsockopt() 只有这些可能的错误状态:

  

<强> EINVAL
  请求的选项option_name未知,或请求的option_lenoption_value无效。

  的 ETERM
  与指定套接字关联的ØMQ上下文终止。

  的 ENOTSOCK
  提供的套接字无效。

  的 EINTR
  通过发出信号中断了操作。

我的疑问是 EINVAL
以及将代码更接近 MCVE 的最小步骤是这样做并发布终端输出:

void* _context;
void* _responder;

assert ( ZMQ_RATE == 8 );                           # mod.000: validate zmq.h compliance
assert ( ZMQ_SUB  == 2 );                           # mod.000: validate zmq.h compliance

_context    = zmq_ctx_new ();

assert ( _context );                                # mod.000: validate <context> instance

_responder  = zmq_socket ( _context, ZMQ_SUB );

assert ( _responder );                              # mod.000: validate <socket> instance

int val     = 123;                                  # mod.000: enforce (int)

int rc      = zmq_setsockopt( _responder, ZMQ_RATE, &val, sizeof(val) );
int ze2     = zmq_errno ();

int           major,  minor,  patch;
zmq_version( &major, &minor, &patch );

printf( "DIAG[zmq_setsockopt() API:%d.%d.%d] RC: (%d) ~ Errno: (%d) ~ Error: (%s)\n",
         major,
         minor,
         patch
         rc,
         ze2,
         zmq_strerror( ze2 )
         );

UPDATE 000.INF

  

ZeroMQ v3.x ,使用连接协议(tcp://ipc://)时,发布方会进行过滤。使用 epgm:// 协议,在订阅方进行过滤。

ZeroMQ v2.x 中,所有过滤都发生在用户方。

UPDATE 000.w7.CHECK

按照 http://technet.microsoft.com/en-us/library/cc957547.aspx
可能想要检查REGISTRY的{key:value} - 存在/状态HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IGMPLevel
&lt; - 不要错过或0 ,这是“回答”的病态部分,但 w7 可以禁止多播(这不应该由zmq_errno()自我展示,但似乎更好的确定相当坚实的理由而不是建立在移动的沙子上,不是吗?)。

UPDATE 001.w7.Final_step

如果在基于 EINVAL 的系统上也会返回指示的 linux 错误测试了相同的方案,fill a ZeroMQ BugReport

其他,问题已解决为 w7 相关,请咨询您的localhost管理员以解决问题。

  

pgm 传输实施需要访问原始IP套接字。某些操作系统可能需要其他权限才能执行此操作。鼓励不要求与其他PGM实施直接互操作的应用程序使用 epgm 传输,而不需要任何特殊权限。