Example #1
0
            // обмен данными с сервером в формате XML
            // nCom - номер команды
            // sPar1
            // nTOutRead - таймаут на ожидание ответа от сервера
            public string ExchgSrv(string nCom, string sPar1, string sDop,
                                   LoadFromSrv dgRead, DataSet dsTrans, ref int ret, int nTOutRead, int nBufSize)
            {
                string
                    sOutFileXML = "",
                    sC,
                    sHost,
                    sAdr,
                    sErr;
                int
                    nPort;

                SocketStream.ASRWERROR
                    nRErr;

                System.IO.Stream
                    stm = null;

                ret       = AppC.RC_CANCEL;
                ServerRet = AppC.EMPTY_INT;
                if (xMF.xCLoad != null)
                {
                    xMF.xCLoad.xLastSE      = this;
                    xMF.xCLoad.sFileFromSrv = "";
                }


                SelSrvPort(nCom, sPar1, out sHost, out nPort);
                sAdr = sHost + ":" + nPort.ToString();
                sErr = sAdr + "-нет соединения!";

                Cursor.Current = Cursors.WaitCursor;

                try
                {
                    CurSocket = new SocketStream(sHost, nPort);
                    if (!TestConn(false, xMF.xBCScanner, xMF.xFPan))
                    {
                        TraiceWiFi(sErr);
                        //throw new System.Net.Sockets.SocketException(11053);
                    }
                    else
                    {
                        //MessageBox.Show("Good reset!");
                    }

                    //TraiceWiFi(nCom + " - перед Connect");
                    stm = CurSocket.Connect();

                    // поток создан, отправка команды
                    sErr = sAdr + "-команда не отправлена";
                    byte[] baCom = SetCommand2Srv(nCom, sPar1, sDop);
                    //stm.Write(baCom, 0, baCom.Length);
                    //stm.Write(AppC.baTermCom, 0, AppC.baTermCom.Length);

                    // 20 секунд на запись команды
                    CurSocket.ASWriteS.TimeOutWrite = 1000 * 10;
                    CurSocket.ASWriteS.BeginAWrite(baCom, baCom.Length);

                    if ((dsTrans != null) || (XMLPars != null))
                    {// передача данных при выгрузке
                     //sErr = sAdr + "-ошибка выгрузки";
                     //dsTrans.WriteXml(stm, XmlWriteMode.IgnoreSchema);
                     //sErr = sAdr + "-ошибка завершения";

                        sErr = sAdr + "-ошибка выгрузки";
                        MemoryStream mst = new MemoryStream();
                        if (dsTrans != null)
                        {
                            dsTrans.WriteXml(mst, XmlWriteMode.IgnoreSchema);
                        }

                        if (XMLPars != null)
                        {
                            mst.Write(XMLPars, 0, XMLPars.Length);
                        }

                        // терминатор сообщения
                        mst.Write(AppC.baTermMsg, 0, AppC.baTermMsg.Length);

                        byte[] bm1 = mst.ToArray();
                        mst.Close();
                        // 60 секунд на запись данных
                        CurSocket.ASWriteS.TimeOutWrite = 1000 * 180;
                        CurSocket.ASWriteS.BeginAWrite(bm1, bm1.Length);
                    }
                    else
                    {
                        sErr = sAdr + "-ошибка завершения";
                        // 10 секунд на запись терминатора сообщения
                        CurSocket.ASWriteS.TimeOutWrite = 1000 * 30;
                        // терминатор сообщения
                        CurSocket.ASWriteS.BeginAWrite(AppC.baTermMsg, AppC.baTermMsg.Length);
                    }


                    //int nCommLen = 0;
                    //byte[] bAns = ReadAnswerCommand(stm, ref nCommLen);
                    //sC = Encoding.UTF8.GetString(bAns, 0, nCommLen - AppC.baTermCom.Length);

                    sErr = sAdr + "-нет ответа сервера!";
                    // 120 секунд на чтение ответа
                    //m_ssExchg.ASReadS.TimeOutRead = 1000 * 120;

                    //m_ssExchg.ASReadS.BufSize = 256;
                    //nRErr = m_ssExchg.ASReadS.BeginARead(bUseFileAsBuf, 1000 * nTOutRead);

                    if (nBufSize > 0)
                    {
                        CurSocket.ASReadS.BufSize = nBufSize;
                    }
                    nRErr = CurSocket.ASReadS.BeginARead(1000 * nTOutRead);

                    switch (nRErr)
                    {
                    case SocketStream.ASRWERROR.RET_FULLBUF:       // переполнение буфера
                        sErr = " длинная команда";
                        throw new System.Net.Sockets.SocketException(10061);

                    case SocketStream.ASRWERROR.RET_FULLMSG:       // сообщение полностью получено
                        sC = CurSocket.ASReadS.GetMsg();
                        break;

                    default:
                        TraiceWiFi("Сетевая ошибка (чтение ответа)");
                        throw new System.Net.Sockets.SocketException(10061);
                    }


                    sErr = sAdr + "-ошибка чтения";
                    //Dictionary<string, string> aComm = SrvCommandParse(sC);
                    ServerAnswer = Srv.SrvAnswerParParse(sC);

                    SyncTimeWithSrv();

                    if (ServerAnswer.ContainsKey("PAR"))
                    {
                        StringAnsPars = ServerAnswer["PAR"];
                        StringAnsPars = StringAnsPars.Substring(1, StringAnsPars.Length - 2);
                        AnswerPars    = Srv.SrvAnswerParParse(StringAnsPars, new char[] { ',' });
                    }


                    //TraiceWiFi("Ответ получен...");
                    ServerRet = int.Parse(ServerAnswer["RET"]);

                    if ((ServerAnswer["COM"] == nCom) &&
                        ((ServerRet == AppC.RC_OK) ||
                         (ServerRet == AppC.RC_NEEDPARS) ||
                         (ServerRet == AppC.RC_HALFOK)))
                    {
                        CurSocket.ASReadS.OutFile = "";
                        if (ServerRet == AppC.RC_NEEDPARS)
                        {
                            CurSocket.ASReadS.TermDat = AppC.baTermMsg;
                            if (CurSocket.ASReadS.BeginARead(true, 1000 * nTOutRead) == SocketStream.ASRWERROR.RET_FULLMSG)
                            {
                                //TraiceWiFi("Доп.Данные получены...");
                                sOutFileXML = CurSocket.ASReadS.OutFile;
                            }
                            else
                            {
                                TraiceWiFi("Сетевая ошибка (чтение данных)");
                                throw new System.Net.Sockets.SocketException(10061);
                            }
                        }

                        if (dgRead != null)
                        {
                            dgRead(CurSocket, ServerAnswer, dsTrans, ref sErr, ServerRet);
                        }
                        try
                        {
                            sErr = ServerAnswer["MSG"];
                        }
                        catch { sErr = "OK"; }
                        //dgRead(m_ssExchg, aComm, dsTrans, ref sErr, nRetSrv);
                        //else
                        //{
                        //    sErr = "OK";
                        //}
                    }
                    else
                    {
                        if (ServerAnswer["MSG"] != "")
                        {
                            sErr = ServerAnswer["MSG"];
                        }
                        else
                        {
                            sErr = sAdr + "\n Отложено выполнение";
                        }
                    }
                    ret = ServerRet;
                }
                catch (Exception e)
                {
                    //sC = e.Message;
                    sErr = e.Message;
                    TraiceWiFi(sErr);
                    ret = 3;
                }
                finally
                {
                    CurSocket.Disconnect();
                    Cursor.Current = Cursors.Default;
                    if (ServerRet == AppC.RC_NEEDPARS)
                    {
                        if (Srv.ExchangeContext.ExchgReason == AppC.EXCHG_RSN.NO_EXCHG)
                        {
                            Srv.ExchangeContext.ExchgReason = AppC.EXCHG_RSN.SRV_INIT;
                            Srv.ExchangeContext.CMD_EXCHG   = nCom;
                            DialogResult xDRslt = xMF.CallDllForm(xMF.sExeDir + "SGPF-Univ.dll", true,
                                                                  new object[] { this, nCom, AppC.R_PARS, sOutFileXML });
                            Srv.ExchangeContext.ExchgReason = AppC.EXCHG_RSN.NO_EXCHG;
                            if (xDRslt == DialogResult.OK)
                            {
                            }
                        }
                    }
                }
                return(sErr);
            }