C# zeromq接收超时,EGAIN正好是第255次

C# zeromq接收超时,EGAIN正好是第255次,c#,zeromq,C#,Zeromq,库:c#项目中的clrzmq4() 我使用的是zmq路由器经销商配置。服务器是用python编写的,在linux上运行。我的经销商客户使用c#编写,在windows机器上运行。它发送消息并等待响应 public Boolean sendMessage(Dictionary<String, String> msgDict) { ZError err; String errStr; v

库:c#项目中的clrzmq4()

我使用的是zmq路由器经销商配置。服务器是用python编写的,在linux上运行。我的经销商客户使用c#编写,在windows机器上运行。它发送消息并等待响应

        public Boolean sendMessage(Dictionary<String, String> msgDict)
        {
            ZError err;
            String errStr;
            var reqFrame = new ZFrame(JsonConvert.SerializeObject(msgDict));
            retval = socket.Send(reqFrame, out err);
            if (err != null)
            {
                errStr = String.Format("Error while sending command {3} {0} {1}", err.Text, err.Number, err.Name);
                return false;
            }

            err = null;

            respFrame = socket.ReceiveFrame(out err);

            if (err != null)
            {
                errStr = String.Format("Error while receiving response data {0} {1} {2} {3}", err.Text, err.Number, err.Name, num_messages);
                return false;
            }
            return true;
       }
公共布尔发送消息(字典msgDict)
{
泽罗错误;
字符串errStr;
var reqFrame=newzframe(JsonConvert.SerializeObject(msgDict));
retval=socket.Send(reqFrame,out err);
if(err!=null)
{
errStr=String.Format(“发送命令{3}{0}{1}时出错”,err.Text,err.Number,err.Name);
返回false;
}
err=null;
respFrame=插座接收框(输出错误);
if(err!=null)
{
errStr=String.Format(“接收响应数据{0}{1}{2}{3}”、err.Text、err.Number、err.Name、num_消息时出错);
返回false;
}
返回true;
}
我将套接字上的sendTimeout和receiveTimeout分别设置为2分钟。 当我一直在255次呼叫sendMessage时,receiveFrame Timeout。在服务器上,我看到消息正在被处理,响应也像每次一样被发送。在这一点之后,我的发送也会超时,并出现相同的错误“EAGAIN”资源暂时不可用

我试过一些东西

  • 长度从2 KB到20 MB不等的数据

  • 将sendhighwatermark和receivehighwatermark设置为不同的值:10、1000、10000

  • 尝试在套接字而不是ReceiveFrame上进行轮询

  • 尝试使插座完全阻塞

  • 在上述每种情况下,故障恰好发生在第255次。在阻塞插座的情况下,它也在第255次被阻塞

    我不能像我想的那样使用netmq,因为它没有curvezmq,服务器需要它


    我还尝试了另一台linux机器上的经销商客户机,第255次甚至更晚都没有问题

    你可能会收到多条信息吗?您可以在
    ReceiveFrame
    之后检查它们,然后执行
    bool more=socket.ReceiveMore
    。。。如果有,您需要全部接收它们(直到
    ReceiveMore
    返回false)。或者您使用
    ReceiveMessage
    获取
    ZMessage
    ,并且
    msg[0]
    是您的
    ZFrame
    感谢您的回复。我尝试了ReceiveMessage并进行了投票,但问题仍然存在。正好是第255次失败。我觉得很奇怪,因为似乎没有其他人有问题。@metadings解决了问题,但还没有解决。当我关闭curve auth时,我可以发送数千条没有问题的消息。当我打开auth时,我被困在255。