TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
Kim Bay-an
NA
49
4.3k
Console application crashing
Oct 18 2019 2:27 AM
Hi guys i have here a console application written in c# , I have spend all my week finding and looking for the reason why it sometimes suddenly crashing, this console app is running continuously, no closing means when i run it it will kept running no shutting down of computer
I put every method with try catch and every catch exception it will write it to the logs but when the application crashed there's no logs so that means there's exception that not being handled
can some one help find the possible reason why. I'm drop off the whole code here.
class
Program
{
[DllImport(
"kernel32.dll"
)]
static
extern
IntPtr GetConsoleWindow();
[DllImport(
"user32.dll"
)]
static
extern
bool
ShowWindow(IntPtr hWnd,
int
nCmdShow);
protected
static
string
server_hostname = ConfigurationManager.AppSettings[
"ServerHostname"
];
protected
static
string
copychimp_server =
""
;
protected
static
int
port_number = 0;
private
static
byte
[] _buffer =
new
byte
[10000];
private
static
List<Socket> _clientSockets =
new
List<Socket>();
private
static
Socket _serverSocket =
new
Socket(Dns.GetHostEntry(ConfigurationManager.AppSettings[
"ServerHostname"
]).AddressList[0].AddressFamily, SocketType.Stream, ProtocolType.Tcp);
private
static
Dictionary<
string
, DateTime> dict_cmd_lastsent =
new
Dictionary<
string
, DateTime>();
private
static
Dictionary<
string
,
double
> dict_cmd_interval =
new
Dictionary<
string
,
double
>();
private
static
Dictionary<
string
,
string
> dict_drive =
new
Dictionary<
string
,
string
>();
private
static
Dictionary<
string
,
string
> dict_host =
new
Dictionary<
string
,
string
>();
static
bool
ConsoleEventCallback(
int
eventType)
{
if
(eventType == 2)
{
}
return
false
;
}
static
ConsoleEventDelegate handler;
// Keeps it from getting garbage collected
// Pinvoke
private
delegate
bool
ConsoleEventDelegate(
int
eventType);
[DllImport(
"kernel32.dll"
, SetLastError =
true
)]
private
static
extern
bool
SetConsoleCtrlHandler(ConsoleEventDelegate callback,
bool
add);
static
void
Main(
string
[] args)
{
Console.Write(
" Enter copychimp server: "
);
copychimp_server = Console.ReadLine();
Console.Write(
"Enter port number: "
);
port_number = Convert.ToInt16(Console.ReadLine());
//copychimp_server = args[0].ToString().Trim();
//port_number = Convert.ToInt16(args[1]);
//Thread.Sleep(3000);
try
{
var server_logs_dir = System.IO.Path.GetDirectoryName(Application.ExecutablePath) +
"\\logs\\"
+ copychimp_server;
var server_config_dir = System.IO.Path.GetDirectoryName(Application.ExecutablePath) +
"\\config"
;
var server_config = System.IO.Path.GetDirectoryName(Application.ExecutablePath) +
"\\config\\" + copychimp_server + "
.config";
if
(!Directory.Exists(server_config_dir))
{
Directory.CreateDirectory(server_config_dir);
}
if
(!Directory.Exists(server_logs_dir))
{
Directory.CreateDirectory(server_logs_dir);
}
var config =
""
;
config +=
"<port>"
+ port_number +
"</port>"
;
config += Environment.NewLine;
try
{
var pid = GetTagValue(File.ReadAllText(server_config),
"PID"
);
var test_pid = Process.GetProcessById(Convert.ToInt16(pid));
var pname = test_pid.ProcessName;
ServerLogs(pname +
" is currently active using PID ("
+ pid +
")"
);
config +=
"<PID>"
+ pid +
"</PID>"
;
File.WriteAllText(server_config, config);
}
catch
(Exception ex)
{
config +=
"<PID>"
+ Process.GetCurrentProcess().Id +
"</PID>"
;
File.WriteAllText(server_config, config);
handler =
new
ConsoleEventDelegate(ConsoleEventCallback);
const
int
SW_HIDE = 0;
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
// To hide
ServerStarted();
Console.ReadKey();
}
}
catch
(Exception ex)
{
ServerLogs(
"Main error: "
+ ex.Message.ToString());
}
}
private
static
void
ServerStarted()
{
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(server_hostname);
IPEndPoint localEndPoint =
new
IPEndPoint(IPAddress.Any, port_number);
ServerLogs(
"CopyChimpServer.exe Started. Waiting for connection..."
);
_serverSocket.Bind(localEndPoint);
_serverSocket.Listen(1);
_serverSocket.BeginAccept(
new
AsyncCallback(AcceptCallback),
null
);
}
catch
(SocketException ex)
{
ServerLogs(
"ServerStarted Error "
+ ex.Message.ToString());
}
}
private
static
string
ServerCommand(
string
hostname)
{
var command =
""
;
try
{
CopyChimpDB copychimp_db =
new
CopyChimpDB();
DataTable dt_robocopy = copychimp_db.GetCopyChimp(
"GetCommand"
, hostname,
""
);
if
(dt_robocopy.Rows.Count == 1)
{
command = dt_robocopy.Rows[0][
"command"
].ToString();
}
else
if
(dt_robocopy.Rows.Count > 1)
{
ServerLogs(hostname +
" GetCommand error: Returns more than 1 row."
);
}
}
catch
(Exception ex)
{
ServerLogs(hostname +
" ServerCommand error "
+ ex.ToString());
}
return
command;
}
private
static
void
ReceiveCallBack(IAsyncResult AR)
{
Thread.Sleep(1000);
Socket socket =
null
;
string
hostname =
""
;
string
ip_address =
""
;
CopyChimpDB copychimp_db =
new
CopyChimpDB();
try
{
socket = (Socket)AR.AsyncState;
int
received = socket.EndReceive(AR);
ip_address = (socket.RemoteEndPoint
as
IPEndPoint).ToString().Split(
':'
)[0];
hostname = dict_host[ip_address];
byte
[] dataBuff =
new
byte
[received];
Array.Copy(_buffer, dataBuff, received);
string
message_to_client =
"wait"
;
if
(Convert.ToDouble(Math.Round((DateTime.Now - Convert.ToDateTime(dict_cmd_lastsent[hostname])).TotalMinutes, 2)) >= dict_cmd_interval[hostname])
{
var server_command = ServerCommand(hostname);
if
(server_command.Trim() !=
""
)
{
//string message_from_client = WebUtility.HtmlDecode(Encoding.ASCII.GetString(dataBuff));
message_to_client +=
"<DriveName>"
+ dict_drive[hostname] +
"</DriveName>"
;
message_to_client +=
"<ServerCommand>"
+ ServerCommand(hostname) +
"</ServerCommand>"
;
try
{
copychimp_db.PostCopyChimp(
"ConnectMachine"
, hostname, ip_address);
}
catch
(Exception oraex)
{
ServerLogs(hostname +
"--"
+ oraex.ToString());
}
dict_cmd_lastsent[hostname] = DateTime.Now;
//ServerLogs(hostname + " updated");
}
}
byte
[] data = Encoding.ASCII.GetBytes(message_to_client);
socket.BeginSend(data, 0, data.Length, SocketFlags.None,
new
AsyncCallback(SendCallback), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None,
new
AsyncCallback(ReceiveCallBack), socket);
}
catch
(SocketException ex)
{
try
{
//_clientSockets.Remove(socket);
ServerLogs(hostname +
" SocketException! "
+ ex.Message.ToString());
if
(hostname !=
""
)
{
try
{
copychimp_db.PostCopyChimp(
"DisconnectMachine"
, hostname, ip_address);
}
catch
(Exception oraex)
{
ServerLogs(hostname +
"--"
+ oraex.ToString());
}
}
}
catch
(Exception ex_)
{
ServerLogs(hostname +
" DisconnectMachine error! "
+ ex_.ToString());
}
}
}
private
static
Thread thread;
private
static
void
AcceptCallback(IAsyncResult AR)
{
string
hostname =
""
;
try
{
CopyChimpDB copychimp_db =
new
CopyChimpDB();
Socket socket = _serverSocket.EndAccept(AR);
string
ip_address =
""
;
//hostname checking
ip_address = (socket.RemoteEndPoint
as
IPEndPoint).ToString().Split(
':'
)[0];
try
{
try
{
hostname = Dns.GetHostEntry(ip_address).HostName;
}
catch
(Exception host_ex)
{
ServerLogs(ip_address +
" GetHostEntry error: "
+ host_ex.Message.ToString());
DataTable dt_ip = copychimp_db.GetCopyChimp(
"GetHostnameByIpAddress"
, hostname, ip_address);
if
(dt_ip.Rows.Count == 1)
{
hostname = dt_ip.Rows[0][
"hostname"
].ToString();
ServerLogs(ip_address +
" GetHostnameByIpAddress : "
+ hostname);
}
}
DataTable dt_hostname = copychimp_db.GetCopyChimp(
"GetHostname"
, hostname, ip_address);
hostname =
""
;
if
(dt_hostname.Rows.Count == 1)
{
hostname = dt_hostname.Rows[0][
"hostname"
].ToString();
}
else
if
(dt_hostname.Rows.Count > 1)
{
ServerLogs(hostname +
" GetHostname error: Returns more than 1 row."
);
}
if
(hostname !=
""
)
{
if
(!_clientSockets.Contains(socket))
{
dict_host[ip_address] = hostname;
_clientSockets.Add(socket);
copychimp_db.PostCopyChimp(
"ConnectMachine"
, hostname, ip_address);
/*---------------------------------------*/
dict_cmd_interval[hostname] = Convert.ToDouble(copychimp_db.GetCopyChimp(
"GetInterval"
, hostname, ip_address).Rows[0][
"interval"
].ToString());
/*-------------------------------------------*/
dict_cmd_lastsent[hostname] = Convert.ToDateTime(copychimp_db.GetCopyChimp(
"GetLastUpdate"
, hostname, ip_address).Rows[0][
"lastupdate"
]);
/*--------------------------------------------*/
dict_drive[hostname] = copychimp_db.GetCopyChimp(
"GetDriveName"
, hostname, ip_address).Rows[0][
"drive_name"
].ToString();
/*--------------------------------------*/
thread =
new
Thread(() =>
{
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None,
new
AsyncCallback(ReceiveCallBack), socket);
});
thread.Start();
ServerLogs(hostname +
" connected"
);
}
}
}
catch
(Exception oraex)
{
ServerLogs(hostname +
"--"
+ oraex.ToString());
}
_serverSocket.BeginAccept(
new
AsyncCallback(AcceptCallback),
null
);
}
catch
(SocketException ex)
{
ServerLogs(
"AcceptCallback SocketException "
+ hostname + ex.Message.ToString());
}
}
private
static
void
SendCallback(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
private
static
void
ServerLogs(
string
text)
{
bool
logging_success =
false
;
try
{
string
logpath = System.IO.Path.GetDirectoryName(Application.ExecutablePath) +
"\\logs\\" + copychimp_server + "
\\
" + DateTime.Now.ToString("
yyyyMMdd
") + "
.log";
do
{
try
{
string
log =
"["
+ DateTime.Now.ToString(
"yyyy-MM-dd HH:mm:ss"
) +
"]"
+
" "
+ text + Environment.NewLine;
if
(!File.Exists(logpath))
{
File.WriteAllText(logpath, log);
}
else
{
File.AppendAllText(logpath, log);
}
logging_success =
true
;
}
catch
(Exception ex)
{
//MessageBox.Show(ex.ToString());
}
}
while
(logging_success ==
false
);
}
catch
(Exception ex)
{
//send emai
}
}
private
static
string
GetTagValue(
string
text,
string
tag)
{
var result =
""
;
try
{
var start_tag =
"<"
+ tag +
">"
;
var end_tag =
"</"
+ tag +
">"
;
int
pFrom = text.IndexOf(start_tag) + start_tag.Length;
int
pTo = text.LastIndexOf(end_tag);
result = text.Substring(pFrom, pTo - pFrom);
}
catch
(Exception ex)
{
ServerLogs(
"GetTagValue() error "
+ ex.Message.ToString());
}
return
result;
}
}
A help a highly appreciated thank you in advance. I need to log it on the DB before the crushing occurred and i'm going to use it as reference for a new automatic emailing if the app crashed
Reply
Answers (
1
)
convert table to json
SQL Lite readonly