예제 #1
0
        private TransResult Unpack8583()
        {
            var ret = TransResult.E_RECV_FAIL;

            try
            {
                var RecvData = new byte[recvLen - headLen];
                RecvData = UnpackHead();

                byte[] len8583 = new byte[2];
                Array.Copy(RecvData, len8583, 2);
                int lenthOf8583 = len8583[0] * 256 + len8583[1];
                if (lenthOf8583 != 0)
                {
                    var RecvBytes = new byte[RecvData.Length - headLen_8583]; //包体数据
                    Array.Copy(RecvData, headLen_8583, RecvBytes, 0, RecvData.Length - headLen_8583);
                    var headBytes = new byte[headLen_8583];
                    Array.Copy(RecvData, headBytes, headLen_8583); //包头数据
                    //解包
                    ret        = TransResult.E_UNPACKET_FAIL;
                    FrontBytes = headBytes;
                    HandleFrontBytes(headBytes); //根据报文头来判断是否要下载密钥
                    RecvPackage.ParseBuffer(RecvBytes, SendPackage.ExistValue(0));


                    var nRet = UnPackFix();
                    if (!mInvokeSetResult)
                    {
                        throw new Exception("should invoke SetRespInfo() in UnPackFix()");
                    }
                    mInvokeSetResult = false;
                    ret = nRet ? TransResult.E_SUCC : TransResult.E_HOST_FAIL;
                    CLog.Info(RecvPackage.GetLogText());
                }
                else
                {
                    ret = TransResult.E_HOST_FAIL;
                }
                if (recvLen > headLen + lenthOf8583 + 2)
                {
                    byte[] jsonByte = new byte[recvLen - headLen - lenthOf8583 - 2];
                    Array.Copy(RecvData, lenthOf8583 + 2, jsonByte, 0, jsonByte.Length);
                    var strJson = Encoding.Default.GetString(jsonByte);
                    RecvPackageJson = JsonConvert.DeserializeObject <CommunicateInfo>(strJson);
                }
            }
            catch (Exception ex)
            {
                Log.Error(GetType().Name, ex);
            }
            return(ret);
        }
예제 #2
0
파일: CCBPay.cs 프로젝트: lijint/DHRQ
        /// <summary>
        /// 重写通信函数
        /// </summary>
        /// <returns></returns>
        internal override TransResult transact()
        {
            int         headLen;
            TransResult ret    = TransResult.E_SEND_FAIL;
            Socket      socket = null;

            if (RealEnv)
            {
                if (!GPRSConnect())
                {
                    return(ret);
                }
                IPAddress  ip  = IPAddress.Parse(serverIP);
                IPEndPoint ipe = new IPEndPoint(ip, serverPort); //把ip和端口转化为IPEndPoint实例
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                try
                {
                    socket.SendTimeout    = sendTimeOut * 1000;
                    socket.ReceiveTimeout = recvTimeOut * 1000;
                    socket.Connect(ipe);
                }
                catch (Exception err)
                {
                    Log.Error(this.GetType().Name, err);
                    return(ret);
                }
            }

            try
            {
                ret = TransResult.E_PACKET_FAIL;
                byte[] SendBytes = new byte[0];
                PackFix();
                Packet();
                if (SendPackage.IsNull())
                {
                    return(TransResult.E_INVALID);
                }
                byte[] MAC = new byte[8];

                //计算mac并将mac打包进去
                if (NeedCalcMac())
                {
                    byte[] macKey = null;
                    //if (EnType == EncryptType.Hardware)
                    //    macKey = KeyManager.GetEnMacKey(mSectionName);
                    //else
                    macKey = KeyManager.GetDeMacKey(mSectionName);
                    if (macKey == null)
                    {
                        throw new Exception("尚未设置MAC密钥");
                    }
                    if ((DType == DesType.Des && macKey.Length == 16) || (DType == DesType.TripleDes && macKey.Length == 8))
                    {
                        throw new Exception("MAC密钥长度不符合DES算法");
                    }
                    int macField = 64;
                    if (SendPackage.ExistBit(1))
                    {
                        macField = 128;
                    }
                    SendPackage.SetArrayData(macField, new byte[8]);
                    byte[] tmp      = SendPackage.GetSendBuffer();
                    byte[] macBytes = new byte[tmp.Length - 8];
                    Array.Copy(tmp, macBytes, macBytes.Length);
                    //Log.Debug(Utility.bcd2str(macBytes, macBytes.Length));
                    if (CalcMac(macBytes, macKey, ref MAC))
                    {
                        SendPackage.SetArrayData(macField, MAC);
                    }
                    else
                    {
                        SendPackage.ClearBitAndValue(macField);
                        throw new Exception("计算MAC失败");
                    }
                }
                SendBytes = SendPackage.GetSendBuffer();
                if (SendBytes.Length <= 0)
                {
                    return(ret);
                }
                byte[] head = PackBytesAtFront(SendBytes.Length);
                headLen = head.Length;
                int sendLen_all = SendBytes.Length + head.Length;

                byte[] sendstr_all = new byte[sendLen_all];
                Array.Copy(head, sendstr_all, head.Length);
                Array.Copy(SendBytes, 0, sendstr_all, head.Length, SendBytes.Length);

                //记录原始发送日志
                //CLog.LogPackage(sendstr_all, SendPackage, CLog.LogType.Send);
                CLog.Info(CLog.GetLog(sendstr_all, SendPackage, this, CLog.LogType.Send));

                ret = TransResult.E_SEND_FAIL;
                if (RealEnv)
                {
                    int sendLen = 0;
                    sendLen = socket.Send(sendstr_all, sendLen_all, 0);
                    if (sendLen <= 0)
                    {
                        socket.Close();
                        return(ret);
                    }
                }

                //从服务器端接受返回信息
                ret = TransResult.E_RECV_FAIL;
                int recvLen = 0;
                if (RealEnv)
                {
                    sRecvBuffer.Initialize();
                    recvLen = socket.Receive(sRecvBuffer, sRecvBuffer.Length, 0);

                    if (recvLen <= 0)
                    {
                        socket.Close();
                        return(ret);
                    }
                    byte[] RecvBytes = new byte[recvLen - headLen];
                    Array.Copy(sRecvBuffer, headLen, RecvBytes, 0, recvLen - headLen);
                    byte[] headBytes = new byte[headLen];
                    Array.Copy(sRecvBuffer, headBytes, headLen);
                    //CLog.Info(RecvPackage);

                    //解包
                    ret        = TransResult.E_UNPACKET_FAIL;
                    FrontBytes = headBytes;
                    HandleFrontBytes(headBytes);//根据报文头来判断是否要下载密钥
                    RecvPackage.ParseBuffer(RecvBytes, SendPackage.ExistValue(0));
                    //CLog.Info(RecvBytes);
                    //记录原始接收日志
                    byte[] logRecv = new byte[recvLen];
                    Array.Copy(sRecvBuffer, logRecv, recvLen);
                    //CLog.LogPackage(logRecv, RecvPackage, CLog.LogType.Recv);
                    CLog.Info(CLog.GetLog(logRecv, RecvPackage, this, CLog.LogType.Recv));
                    bool nRet = UnPackFix();
                    if (!mInvokeSetResult)
                    {
                        throw new Exception("should invoke SetRespInfo() in UnPackFix()");
                    }
                    mInvokeSetResult = false;
                    if (nRet)
                    {
                        ret = TransResult.E_SUCC;
                    }
                    else
                    {
                        ret = TransResult.E_HOST_FAIL;
                    }
                }
                else
                {
                    ret = TransResult.E_SUCC;
                }
            }
            catch (System.Exception ex)
            {
                Log.Error(this.GetType().Name, ex);
            }
            finally
            {
                if (socket != null && socket.Connected)
                {
                    socket.Close();
                }
            }
            return(ret);
        }