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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章