ZMQ的EFSM问题

昨天,调试C#的ZeroMQ程序的时候,zmq_msg_send函数经常返回EFSM错误(156384763),而且出现这个错误以后就一直出现。网上查了半天,国内网上基本没有什么有用的资料。对于错误号的官方文档描述,几乎也没有什么用处。

EFSM

    zmq_send()函数当前无法对这个socket进行操作,因为这个socket处在与此操作不适当的状态。这个错误可能出现在那些在几种状态之间进行切换的socket上,比如ZMQ_REP。请参照zmq_socket(3)函数部分的消息模式部分以获取更多信息。

在国外网上查了一些资料

Reconnect over req-rep does not seem to work

https://github.com/zeromq/libzmq/issues/172

zeromq: reset REQ/REP socket state

https://stackoverflow.com/questions/26915347/zeromq-reset-req-rep-socket-state

对于REQ、REP模式有了一些了解, 主要是因为REQ、REP模式的时候,通信的序列一定是send()->recv() / recv()->send() ,只有send,没有recv,或者recv出错的时候,就要导致zmq处于不正确的状态。

而我的程序,由于绑定的地址出错,所以send总是能成功,但是服务器不会有返回,导致recv总是出错,返回EAGAIN错误号,然后导致zmq处于错误状态,导致不能调用send函数。

    把zmq的endpoint参数指向正确的地址的时候,EFSM问题就顺利解决了。

   另外要注意的一点,由于服务器没有打开,客户端使用REQ的zmq socket去连接的时候,也会出现EFSM,这时候可以知道只是程序的正常流程,打印log,然后关闭socket,重新connectsocket即可。

使用了C#的zmq客户端,比起通过调用一个C++编写的dll来调用zmq的方式,经过测试,C#客户端的方式反而更快,不知是不是因为debug版的原因。 测试调用100次 58000字节内容的发送接收时, C#的方式10W+ ticks, C++ 则为14W ticks左右

C#的ZeroMQ适配https://github.com/zeromq/clrzmq4

你可能感兴趣的:(ZMQ的EFSM问题)