// обмен данными с сервером в формате 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); }