我无法在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
答案 0 :(得分:0)
API
的zmq_setsockopt()
只有这些可能的错误状态:<强>
EINVAL
强>
请求的选项option_name
未知,或请求的option_len
或option_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
传输,而不需要任何特殊权限。