I'm writing a program that in its most simplest form acts as a proxy between a local client and a remote server. But I cannot figure out how to detect when either the connection to the client is close or the connection to the server is closed. I've tried looking at socket.connected - it always returns true, even when the client program has disconnected. I've tried getting an exception from the networkstream.DataAvailable, it always just reads false, and no exceptions. Anyone know how I can detect when these sockets are remotely closed??
- TcpListener listener;
-
TcpClient client;
-
TcpClient server;
-
while (true)
-
{
-
Thread.Sleep(10);
-
IPAddress addy = IPAddress.Parse("127.0.0.1");
-
listener = new TcpListener(addy, 4001);
-
listener.Start();
-
client = listener.AcceptTcpClient();
-
Console.WriteLine("[[Client connected.]]");
-
server = new TcpClient();
-
server.Connect("imperian.com", 23);
-
Console.WriteLine("[[Server connected.]]");
-
NetworkStream cstm = client.GetStream();
-
NetworkStream sstm = server.GetStream();
-
bool quit = false;
-
while (!quit)
-
{
-
Thread.Sleep(10);
-
-
if (!client.Client.Connected)
-
{
-
Console.WriteLine("[[Client disconnected]]");
-
}
-
-
try
-
{
-
if (cstm.DataAvailable)
-
{
-
byte[] readBuffer = new byte[1024];
-
StringBuilder builder = new StringBuilder();
-
int numBytes = 0;
-
do
-
{
-
numBytes = cstm.Read(readBuffer, 0, readBuffer.Length);
-
builder.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer));
-
} while (cstm.DataAvailable);
-
-
byte[] writeBuffer = Encoding.ASCII.GetBytes(builder.ToString());
-
sstm.Write(writeBuffer, 0, writeBuffer.Length);
-
}
-
-
if (sstm.DataAvailable)
-
{
-
byte[] readBuffer = new byte[1024];
-
StringBuilder builder = new StringBuilder();
-
int numBytes = 0;
-
do
-
{
-
numBytes = sstm.Read(readBuffer, 0, readBuffer.Length);
-
builder.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer));
-
} while (sstm.DataAvailable);
-
-
byte[] writeBuffer = Encoding.ASCII.GetBytes(builder.ToString());
-
cstm.Write(writeBuffer, 0, writeBuffer.Length);
-
}
-
}
-
catch (Exception)
-
{
-
cstm.Close();
-
Console.WriteLine("[[Client disconnected.]]");
-
sstm.Close();
-
Console.WriteLine("[[Server disconnected.]]");
-
break;
-
quit = true;
-
}
-
}
-
}