C# 检测TcpListener客户端状态
2009-12-14 19:19
337 查看
最近在写异步TCP程序,在调试时遇到了Client关闭后程序在接收回调里死循环,用client.Connected 检测好像也没用,在网上找到几篇用Socekt检测的文章,都还可以达到Client强行关闭后程序在退出死循环的功能。
本人这个是在原有的程序上加了一个小小的判断条件就实现了,相比起来也是比较简单的,其主要代码如下:
private void AcceptConnect()
{
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
listener = new TcpListener(ip[0], 60000);
listener.Start();
while (isExit ==false)
{
try
{
allDone.Reset();
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
Console.Write("开始等待客户接入 /n/r");
listener.BeginAcceptTcpClient(callback, listener);
allDone.WaitOne();
}
catch (Exception err)
{
Console.Write(err.ToString());
break;
}
}
}
private void AcceptTcpClientCallback(IAsyncResult ar)
{
TcpListener myListener = (TcpListener)ar.AsyncState;
try
{
allDone.Set();
TcpClient client = myListener.EndAcceptTcpClient(ar);
AlarmTCPObject readWriteObject = new AlarmTCPObject(client);
Console.Out.Write("已经接受" + client.Client.RemoteEndPoint.ToString() + "连接");
SendString(readWriteObject, "服务器已经接受连接,请通话");
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
catch (Exception err)
{
return;
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
AlarmTCPObject readWriteObject = (AlarmTCPObject)ar.AsyncState;
int Count = readWriteObject.netStream.EndRead(ar);
byte[] TempForXmsg = new byte[Count];
Console.Out.Write(string.Format("来自{0}:{1}/r/n", readWriteObject.client.Client.RemoteEndPoint, System.Text.Encoding.ASCII.GetString(readWriteObject.readBytes, 0, Count)));
if (isExit == false && Count !=0) //添加的Count !=0 就可以退出死循环,
{
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
}
catch (Exception err)
{
Console.Write(err.ToString());
}
}
本人这个是在原有的程序上加了一个小小的判断条件就实现了,相比起来也是比较简单的,其主要代码如下:
private void AcceptConnect()
{
IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());
listener = new TcpListener(ip[0], 60000);
listener.Start();
while (isExit ==false)
{
try
{
allDone.Reset();
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
Console.Write("开始等待客户接入 /n/r");
listener.BeginAcceptTcpClient(callback, listener);
allDone.WaitOne();
}
catch (Exception err)
{
Console.Write(err.ToString());
break;
}
}
}
private void AcceptTcpClientCallback(IAsyncResult ar)
{
TcpListener myListener = (TcpListener)ar.AsyncState;
try
{
allDone.Set();
TcpClient client = myListener.EndAcceptTcpClient(ar);
AlarmTCPObject readWriteObject = new AlarmTCPObject(client);
Console.Out.Write("已经接受" + client.Client.RemoteEndPoint.ToString() + "连接");
SendString(readWriteObject, "服务器已经接受连接,请通话");
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
catch (Exception err)
{
return;
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
AlarmTCPObject readWriteObject = (AlarmTCPObject)ar.AsyncState;
int Count = readWriteObject.netStream.EndRead(ar);
byte[] TempForXmsg = new byte[Count];
Console.Out.Write(string.Format("来自{0}:{1}/r/n", readWriteObject.client.Client.RemoteEndPoint, System.Text.Encoding.ASCII.GetString(readWriteObject.readBytes, 0, Count)));
if (isExit == false && Count !=0) //添加的Count !=0 就可以退出死循环,
{
readWriteObject.InitReadArray();
readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, ReadCallback, readWriteObject);
}
}
catch (Exception err)
{
Console.Write(err.ToString());
}
}
相关文章推荐
- C# 对 TCP 客户端的状态封装
- 在C#中对TCP客户端的状态封装详解
- C#利用TcpListener和TcpClient类实现服务器和客户端的通信
- C# 基于TcpListener和TcpClient的客户端服务端通信
- C#网络编程.2.套接字.TcpListener.TcpClient.服务端客户端通信
- [原创]Coding4Fun检测你的网络,用C#获取本机TCP、UDP状态及连接(一)
- [原创]Coding4Fun检测你的网络,用C#获取本机TCP、UDP状态及连接(二)
- C#网络编程.2.套接字.TcpListener.TcpClient.服务端客户端通信
- C# TcpClient 连接状态检测
- [C#]使用TcpListener及TcpClient开发一个简单的Chat工具
- C# asynchronous TcpListener
- C# Socket TCP简单例子(服务器与客户端通信)
- C# TcpListener的编程要点
- TCP 连接异常状态检测
- C# 超级简单的Telnet (TcpClient)客户端
- C#Tcp多个客户端与服务器数据与文件传输
- 动手学习TCP:客户端状态变迁
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- C#网络编程-TcpClient、TcpListener、UdpClient
- C#:一个增强的TcpListener(二)线程池