static bool ReceiveMsg(ZSocket sock, ref ZMessage message, out string address, out ZError error) { error = ZError.None; // address = IPAddress.None; address = string.Empty; // STREAM: read frames: identity, body // read the ip4 address from (ZFrame)frame.GetOption("Peer-Address") int receiveCount = 2; do { var frame = ZFrame.CreateEmpty(); while (-1 == zmq.msg_recv(frame.Ptr, sock.SocketPtr, (int)(/* ZSocketFlags.DontWait | */ ZSocketFlags.More))) { error = ZError.GetLastErr(); if (error == ZError.EINTR) { error = default(ZError); continue; } frame.Close(); return(false); } if (message == null) { message = new ZMessage(); } message.Add(frame); if (receiveCount == 2) { if (default(string) == (address = frame.GetOption("Peer-Address", out error))) { // just ignore error = default(ZError); address = string.Empty; } } } while (--receiveCount > 0); return(true); }
internal void OnRecvMsg(BaseZmqWorker worker, ZMessage recvMsg) { using (recvMsg) { var startTime = DateTime.UtcNow; using (recvMsg) { var clientAddr = recvMsg[0]; var clientData = recvMsg[2].Read(); var baseRequestMsg = MsgPackTool.GetMsg <BaseRequestMsg>(clientData); var requestDataMsg = baseRequestMsg.Data; var responseTask = ProcessRequest(requestDataMsg); responseTask.Wait(); var responseMsg = responseTask.Result; // if no session key, generate new var sessionToken = baseRequestMsg.SessionToken; if (string.IsNullOrEmpty(sessionToken)) { sessionToken = GenerateSessionKey(); } var baseResponseMsg = new BaseResponseMsg() { SessionToken = sessionToken, RequestToken = baseRequestMsg.RequestToken, Data = responseMsg, }; var sendData = MsgPackTool.GetBytes(baseResponseMsg); var messageToServer = new ZMessage(); messageToServer.Append(clientAddr); messageToServer.Append(ZFrame.CreateEmpty()); messageToServer.Append(new ZFrame(sendData)); worker.workerSocket.SendMessage(messageToServer); } Logger.Trace("Receive Msg and Send used Time: {0:F5}s", (DateTime.UtcNow - startTime).TotalSeconds); } }