i have a program which does receiving TCP message and send it to the message queue. It is a console application and it runs 24/7. After running 2-3 weeks, it used huge memory space. There must be some sort of memory leak in my code. Could you guys please help me out? Thank you so much. Here is my code:
static
void Main(string[] args)
{
// Determine whether the message shoulb be recorded or not
string msgRecord = ConfigurationSettings.AppSettings["Record_Msg"];
int port = 0;
string databaseName = String.Empty;
string keyValue = String.Empty;
string connectionString = String.Empty;
string inputArgs = String.Empty;
string queuePath = String.Empty;
string sqlServer = "SERVER";
byte[] data;
SqlConnection myConnection;
SqlCommand myCommand;
Messenger sender =
new Messenger();
if (args.Length == 0)
{
Console.WriteLine("Please enter the database name and key value");
inputArgs = Console.ReadLine();
}
else
{
foreach (string inpt in args)
{
if (inpt.Substring(0,5) == "DBNM:")
{
databaseName = inpt.Substring(5,(inpt.Length-5));
}
if (inpt.Substring(0,5) == "INFO:")
{
keyValue = inpt.Substring(5,(inpt.Length-5));
}
if (inpt.Substring(0,5) == "DBAL:")
{
sqlServer = inpt.Substring(5,(inpt.Length-5));
}
}
}
//Set up a connection to database and get the tcp port# and message queue path
connectionString = "Data Source=" + sqlServer+";Integrated Security=SSPI;Initial Catalog=" + databaseName;
myConnection =
new SqlConnection(connectionString);
myCommand = myConnection.CreateCommand();
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandText = "pro_TCP2MSG_PORT";
myCommand.Parameters.Add("@Keyvalue",SqlDbType.VarChar,10);
myCommand.Parameters.Add("@Port",SqlDbType.VarChar,10);
myCommand.Parameters.Add("@QueuePath",SqlDbType.VarChar,40);
myCommand.Parameters["@Keyvalue"].Value = keyValue;
myCommand.Parameters["@Port"].Direction = ParameterDirection.Output;
myCommand.Parameters["@QueuePath"].Direction = ParameterDirection.Output;
try
{
myConnection.Open();
int rtn = myCommand.ExecuteNonQuery();
port = Convert.ToInt32(myCommand.Parameters["@Port"].Value.ToString());
queuePath = myCommand.Parameters["@QueuePath"].Value.ToString();
}
catch (SqlException sexp)
{
Console.WriteLine("ERROR!! : " + sexp.Message.ToString()+ "Please check with your DBA regarding this error");
Console.WriteLine("The program will terminate in 10 seconds");
Thread.Sleep(10000);
return;
}
catch
{
Console.WriteLine("ERROR!! : No data was found for the input value " + keyValue.ToUpper() + " Please check with your DBA regarding this error");
Console.WriteLine("The program will terminate in 10 seconds");
Thread.Sleep(10000);
return;
}
finally
{
if (myConnection.State == ConnectionState.Open)
myConnection.Close();
myCommand.Dispose();
myConnection.Dispose();
GC.Collect();
}
Socket server =
new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint myself =
new IPEndPoint(IPAddress.Any,port);
server.Bind(myself);
server.Listen(5);
Socket client = server.Accept();
IPEndPoint newClient = (IPEndPoint)client.RemoteEndPoint;
string conTime = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
Console.WriteLine("Connected with {0} at port# {1} on {2}",newClient.Address,newClient.Port,conTime);
while (true)
{
try
{
data = sender.ReceiveVarData(client);
if (data.Length == 0)
{
string disTime = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
Console.WriteLine("Disconnected with {0} on {1}", newClient.Address,disTime.ToString());
client.Close();
client = server.Accept();
newClient = (IPEndPoint)client.RemoteEndPoint;
conTime = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
Console.WriteLine("Connected with {0} at port# {1} on {2}",newClient.Address,newClient.Port,conTime);
}
else
{
sender.SendToQueue(data,queuePath);
if (msgRecord.ToUpper() == "TRUE")
sender.RecordMessage(data,queuePath);
}
}
catch(SocketException sexp)
{
Console.WriteLine("ERROR! Cannot receive data from the client...");
Console.WriteLine("DETAIL ERROR: " + sexp.Message.ToString());
Console.WriteLine("Disconnecting from client and waiting for a new client...");
client.Close();
client = server.Accept();
newClient = (IPEndPoint)client.RemoteEndPoint;
conTime = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
Console.WriteLine("Connected with {0} at port# {1} on {2}",newClient.Address,newClient.Port,conTime);
}
finally
{
data =
null;
}
}
}
}
class Messenger
{
private static string connectionString="Data Source=(local);Integrated Security=SSPI;Initial Catalog=xxx;" +
"Min Pool Size=1;Max Pool Size=5;Pooling=True";
private SqlConnection localCon = new SqlConnection(connectionString);
private SqlCommand localCmd;
public Messenger()
{
}
/// <summary>
/// Receive variable length TCP data
/// </summary>
/// <param name="s">TCP Socket</param>
/// <returns></returns>
public byte[] ReceiveVarData(Socket s)
{
int total = 0;
int recv = 0;
//The first 4 byte will contain the total length of the message in ASCII format
byte[] datasize = new byte[4];
int size = 0;
byte[] data ;
try
{
recv = s.Receive(datasize,0,4,SocketFlags.None);
size = Convert.ToInt32(Encoding.ASCII.GetString(datasize));
int dataleft = (int)size;
data =
new byte[size];
while (total < (int)size)
{
recv = s.Receive(data,total,dataleft,SocketFlags.None);
if (recv == 0)
break;
total += recv;
dataleft -= recv;
}
}
catch
{
data =
new byte[0];
}
return data;
}
/// <summary>
/// Send the TCP data to message queue
/// </summary>
/// <param name="data">TCP data</param>
/// <param name="queuePath">Message Queue path</param>
public void SendToQueue(byte[] data, string queuePath)
{
string tcpMsg = Encoding.ASCII.GetString(data);
Message queMsg =
new Message(tcpMsg,new XmlMessageFormatter());
Console.WriteLine("Sending message length " + tcpMsg.Length.ToString() + " to the queue " + queuePath);
if (!MessageQueue.Exists(@".\Private$\" + queuePath))
{
MessageQueue newQueue = MessageQueue.Create(@".\Private$\"+queuePath);
newQueue.SetPermissions("Everyone",MessageQueueAccessRights.FullControl);
newQueue.Label = queuePath;
newQueue.Send(queMsg);
newQueue.Close();
newQueue.Dispose();
queMsg.Dispose();
}
else
{
MessageQueue existingQueue =
new MessageQueue(@".\Private$\" + queuePath);
existingQueue.Send(queMsg);
existingQueue.Close();
existingQueue.Dispose();
queMsg.Dispose();
}
}