Диплом: Автоматизация управления серверными приложениями в ООО «Норс Студиос»

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
107
if (sockAddr == null &&
cfg_data[i].StartsWith("SockAddr=")) { sockAddr =
cfg_data[i].Substring(9); continue; }
//if (pipeName == null &&
cfg_data[i].StartsWith("PipeName=")) { pipeName =
cfg_data[i].Substring(9); prms++; continue; }
//if (address == null &&
cfg_data[i].StartsWith("Address=")) { address = cfg_data[i].Substring(8);
continue; }
}
//grab last server config
if (sid != null)
{
if (sid.Equals("central",
StringComparison.OrdinalIgnoreCase) && sockPort != null && sockAddr !=
null &&
(!sockPort.Equals(SACEntity.CentralSockPort) ||
!sockAddr.Equals(SACEntity.CentralSockAddr)))
{
SACEntity.CentralSockPort = sockPort;
SACEntity.CentralSockAddr = sockAddr;
forceUpd = true;
}
else if (prms == 4) //if server config have all required
params
{
if (isNew) { SACs_Entities.Add(new SACEntity(sid,
name, sockPort, rootPath, mainFile)); }
else
{
int j = 0;
for (; j < SACs_Entities.Count; j++) if
(SACs_Entities[j].ServerID.Equals(sid)) { break; }
if (j < SACs_Entities.Count)
SACs_Entities[j].Update(name, sockPort, rootPath, mainFile, forceUpd);
else SACs_Entities.Add(new SACEntity(sid, name,
sockPort, rootPath, mainFile));
}
}
}
sid = name = sockPort = rootPath = mainFile = sockAddr =
null;
prms = 0; pos = 0; cfg_data = null;
if (!isNew) {
sids = sids + sid + '\0';
string[] sids_a = sids.Split(new char[] { '\0' },
StringSplitOptions.RemoveEmptyEntries);
int i = SACs_Entities.Count, j = 0;
108
for (; i-- > 0; )
{
for (; j < sids_a.Length; j++)
if (SACs_Entities[i].ServerID.Equals(sids_a[j]))
break;
if (j == sids_a.Length) { SACs_Entities[i].Stop();
SACs_Entities[i] = null; SACs_Entities.RemoveAt(i); }
}
sids_a = null; i = -1; j = -1;
}
sids = null;
}
private void termHandler(System.Diagnostics.Process sac, string
sid, EventArgs e)
{
this.sendData(Encoding.UTF8.GetBytes(
String.Format("{0}:sacc:{1}:{2}{3}{4}{5}",
sid, (char)PQC.Error, (char)PMC.Crash,
Utils.Int64ToByteString(DateTime.UtcNow.ToBinary()),
Utils.Int32ToByteString(sac.Id),
Utils.Int32ToByteString(sac.ExitCode))));
}
private void sendData(byte[] data)
{
IPAddress ipAddr =
Dns.GetHostEntry(this.CentralSockAddr).AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr,
int.Parse(this.CentralSockPort));
//NamedPipeClientStream DataSender = new
NamedPipeClientStream(CentralAddress, this.CentralPipeName,
PipeDirection.Out);
int sz = 0;
byte[] dataBuff = new byte[4 + data.Length];
bool repeat = true;
dataBuff[sz++] = (byte)(data.Length >> 24); dataBuff[sz++] =
(byte)(data.Length >> 16);
dataBuff[sz++] = (byte)(data.Length >> 8); dataBuff[sz++] =
(byte)(data.Length);
data.CopyTo(dataBuff, sz + 4); data = null;
dataBuff = Utils.Encode(dataBuff);
while (repeat)
{
repeat = false;
try
{
Socket DataSender = new Socket(ipAddr.AddressFamily,
SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 5000, };
109
IAsyncResult conn =
DataSender.BeginConnect(ipEndPoint, null, null);
if (!conn.AsyncWaitHandle.WaitOne(5000, true)) throw
new TimeoutException();
DataSender.EndConnect(conn);
DataSender.Send(dataBuff);
//DataSender.Connect(5000);
//DataSender.Write(dataBuff, 0, dataBuff.Length);
DataSender.Disconnect(false);
DataSender.Close(0);
DataSender.Dispose();
DataSender = null;
}
catch (TimeoutException) { repeat = true; }
//catch (IOException) { repeat = true; }
catch (SocketException ex) { if (ex.ErrorCode == 10060)
repeat = true; }
catch (ObjectDisposedException) { repeat = true; }
catch { }
}
dataBuff = null; sz = -1;
}
private class SACEntity
{
public static string CentralSockPort = null;
public static string CentralSockAddr = null;
//public static string CentralPipeName = null;
//public static string CentralAddress = null;
public static event TerminationHandler UnexpectedTermination;
public string ServerID { get; private set; }
string LaunchArgs;
string SlavePID;
Process SAC_Proc;
bool IsEnabled, IsRestart, IsStarted;
public SACEntity(string sid, string sn, string spn, string
srp, string smf)
{
IsEnabled = true;
IsRestart = false;
IsStarted = false;
ServerID = sid;
LaunchArgs = string.Format("\"{0}\" \"{1}\" \"{2}\"
\"{3}\" \"{4}\"", ServerID, sn, spn, srp, smf);
SAC_Proc = new Process
{
110
StartInfo = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = LaunchArgs,
FileName =
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name,
},
EnableRaisingEvents = true,
};
SAC_Proc.OutputDataReceived += (sender, e) => { if
(this.IsEnabled) handleData(e.Data); };
SAC_Proc.Exited += (sac, e) => { IsStarted = false;
if (!this.IsEnabled) { this.Dispose(); return; }
if (this.IsRestart) { Launch(SlavePID == null? null :
((char)(0x2) + SlavePID)); return; }
if (this.IsEnabled && UnexpectedTermination != null)
UnexpectedTermination((Process)sac, this.ServerID, e);
};
}
public void Update(string sn, string spn, string srp, string
smf, bool force)
{
string ola = this.LaunchArgs;
this.LaunchArgs = string.Format("\"{0}\" \"{1}\" \"{2}\"
\"{3}\" \"{4}\"", ServerID, sn, spn, srp, smf);
if (force || !ola.Equals(this.LaunchArgs))
{
this.IsRestart = true;
this.sendData("stop");
}
ola = null;
}
/// <param name="flag">chars sequence contains one char -
flag(0,1,2) and 4 chars - pid; null if no flag </param>
public void Launch(string flag)
{
if (IsStarted) return;
this.IsRestart = false;
this.IsStarted = true;
if (CentralSockPort == null || CentralSockAddr == null)
return; //send notify about incorrect config
SAC_Proc.StartInfo.Arguments = string.Format("-sac
\"{0}\" {1} \"{2}\" \"{3}\"",
111
(flag != null ? ("-flag:" + flag) :
""), SAC_Proc.StartInfo.Arguments, CentralSockAddr, CentralSockPort);
SAC_Proc.Start();
}
public void Stop() { IsEnabled = false;
this.sendData("stop"); }
/// <summary> Send data to SAC instance via stdInput
</summary>
public void sendData(string data)
{
if (!IsStarted) return;
SAC_Proc.StandardInput.Write(data);
}
/// <summary> Handle data from stdOutput </summary>
private void handleData(string data)
{
int pos = data.IndexOf(':');
string key = data.Substring(0, pos).ToLower();
string val = data.Substring(pos + 1);
if (key == "pid") { SlavePID = ((val[0] << 24 | val[1] <<
16 | val[2] << 8 | val[3]) == -1 ? null : val); }
if (key == "rsn" && val == "remote") IsEnabled = false;
}
private void Dispose()
{
this.SAC_Proc.Close(); this.SAC_Proc.Dispose();
this.LaunchArgs = null; this.ServerID = null;
this.SlavePID = null;
}
}
}

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
«Управление ресурсами проекта» (на примере организации ООО «ЛАКОСТЭ»)
Agile-методология в управлении проектами на примере ООО «Ресурсный центр «Академия КлассИнфо»
Aвтoмaтизaция пpoцecca вeдeния инфopмaциoннoй бaзы o дoлжнocтяx и вaкaнcияx c укaзaниeм тpeбoвaний к уpoвню знaний и нaвыкoв кaндидaтoв для гpуппы кaдpoв вoйcкoвoй чacти 3474»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
Cовершенствование управления рентабельности предприятия (на примере гуипп «бендерская типография «полиграфист»)