如何停止SOCKET监听
当前写一个基于ASP.NET的SOCKET通信程序,开始监监听,用的是异步方式,但无法实现停止监听。//返回1:所有IP地址已经断开;
try
{
bTcpListen = false;
CloseAllClient();//关闭所有客户端连接已经实现,但如何实现listener停止监听??
HTsession = null;
if (listener != null)
{
listener.Dispose();
}
if (myThread !=null)
myThread.Abort();//线程停止
//myThread = null;
//threadEnd[0].Set();
bSuccess = true;
}
catch (Exception ex1)
{
bSuccess = false;
} --------------------编程问答-------------------- 应该关闭你的listen的socket不就好了么.
--------------------编程问答-------------------- --------------------编程问答-------------------- 监听的套接字调用close()方法。 --------------------编程问答-------------------- 现在的问题是,关闭不了,不是报异常错误,就是用close后,监听依然在打开。 --------------------编程问答-------------------- 關注。 --------------------编程问答-------------------- 给我看看你的代码行么。如果我猜的没错,监听应该是循环监听的吧?关闭循环不就完事了? --------------------编程问答-------------------- 哦看错了是监听,我以为是接收 --------------------编程问答--------------------
如果关了,你的监听还在.那就貌似是你关错了.不妨贴点代码上来看看.
--------------------编程问答-------------------- public void startThread()
{
try
{
if (bTcpListen == false)
{
try
{
myThread = new Thread(new ThreadStart(StartListening));
myThread.Start();
}
catch (System.Exception e)
{
}
}
else
{
}
}
catch (System.Exception er)
{
}
} --------------------编程问答-------------------- public void StartListening()
{
byte[] bytes = new Byte[4096];// 设置接收数据缓存大小
string strPort = SCommon.cCommon.strHostPort;//"5003";
int intPort = Convert.ToInt16(strPort);
IPAddress ipAddress = IPAddress.Parse(SCommon.cCommon.strHosIP);
IPEndPoint iep = new IPEndPoint(ipAddress, intPort);
HTsession = new Hashtable(150);
if (listener == null )
{
//创 TCP/IP socket.
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
// 绑定SOCKET,监听连接
try
{
listener.Bind(iep);
listener.Listen(1000);
alSock = new ArrayList();
bTcpListen = true;
//strSocketActive = "端口:" + strPort + "正在监听......" + "\r\n";
while (bTcpListen )
{
allDone.Reset();// Set the event to nonsignaled state.
// 开始异步SOCKET监听连接.
Debug.WriteLine("Waiting for a connection...");
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
}
}
catch (Exception e)
{
//threadEnd[0].Set();
Debug.WriteLine(e.ToString());
bTcpListen = false;
}
}
--------------------编程问答-------------------- 如何停止? --------------------编程问答-------------------- AcceptCallback中listener.Close
为何要用
while (bTcpListen )
{
allDone.Reset();// Set the event to nonsignaled state.
// 开始异步SOCKET监听连接.
Debug.WriteLine("Waiting for a connection...");
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
}
这样的写法呢?
不如这样
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
在AcceptCallback里面递归调用listener.BeginAccept就完成循环监听了
想关闭的时候在
AcceptCallback中调用listener.Close方法
--------------------编程问答-------------------- 你意思是不要用:
allDone.Reset();// Set the event to nonsignaled state.
和
allDone.WaitOne();
当把bTcpListen =false时, 在acceptcallback中将listener.Close??
网上对allDone是这么解释的:
//当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,
//它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。
//调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,
//它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
//一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。 --------------------编程问答-------------------- 大哥,你纠结ALLDONE干什么,我真服气了,他跟你的SOCKET编程一点关系没有而且你的程序里根本不需要用这个线程锁,你要问的是什么是关闭监听
你可以这么理解
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
每一次调用就只能监听一次!懂么?连接进来一次,你的这个监听就结束了除非再开一个,
listener你把这个SOCKET对象关闭掉,看看行不行,不行的话就是因为这个委托,已经被系统调用了,是系统在帮你管理这个委托,如果行的话就不是,自己试试呗 --------------------编程问答-------------------- 我说的系统不是你的应用程序,而是WINDOWS操作系统 --------------------编程问答-------------------- 去掉allDone是不是行了,一运行就报错误:无法访问已释放的对像。\r\n对象名:"System.Net.Sockets.Socket" --------------------编程问答--------------------
运行错跟allDone是没有关系的, 错误的原因是因为你的Socket的问题.
--------------------编程问答-------------------- 1111111111111111111111111111111111111111111111111111111111111111 --------------------编程问答-------------------- 何解?在ASP.NET中到底如何顺利关掉SOCKET监听服务(我用的是异步) --------------------编程问答-------------------- 你这也不是异步的呀。。异步的是BeginAccept 加事件 里调用EndAccept 。 --------------------编程问答-------------------- 1.改变程式写法,用BeginAccept方法,里面再EndAccept。
2.看看你的Asp.net运行的账户是否有权限直接操作socket(就像是否有权限关闭僵死的word进程)。
3.关闭socket时先用“温柔”方法(如close),异常后用“强硬”方法(shutdown之类)。
希望对你有帮助! --------------------编程问答-------------------- http://topic.csdn.net/u/20111005/09/6dfda253-d7f7-4852-ba4d-c371acbe13a9.html?29284
请高手顺便帮我看一这我写的SOCKET代码有什么问题了。。
顺便...顺便...
呵呵..楼主不会.... --------------------编程问答-------------------- public void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket newReSocket = (Socket)ar.AsyncState;
Socket handler = newReSocket.EndAccept(ar);
StateObject state = new StateObject();
state.workSocket = handler;
。。。。。。。。。。。。。。。
}
在Acceptcallbak中有endaccept,问题的根结应该不是这个! --------------------编程问答-------------------- 监听的套接字调用close()方法。 --------------------编程问答-------------------- 不行,会报错误!
再有在启动线程后,一会时间内,线程会报错:“Thread was being aborted”
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
而异常错误是我在此段代码中捕获的,我没有强制中止线程,是什么原因造成线程被中止? --------------------编程问答--------------------
还是仔细先看这个例子吧.
http://msdn.microsoft.com/zh-cn/library/fx6588te(v=VS.90).aspx#Y0 --------------------编程问答-------------------- 我就是这么写的,但示例中并没有停止监听内容,或中止监测线程内容! --------------------编程问答--------------------
貌似这个demo里面没法停止进行监测.除非强制关闭,因为主线程里面的StartListening()有个while(true)的死循环.
除非你把StartListening()放在一个单独的一个线程里面进行处理,然后在外部通过变量或者其他同步的方式来控制listen线程可根据变量来退出.
--------------------编程问答--------------------
而且主要的是这个demo里面的allDone你也不需要用,demo里面是接受一个客户端传送来的数据,并返回给其响应成功以后再接受下一个连接请求,不知道你是否需要的是能同时处理多客户端并发的情况. 这个只是个例子,貌似需要修改很多地方.
--------------------编程问答-------------------- 关闭listen的socket,用close方法。 --------------------编程问答-------------------- 关 不掉,强制 写上去会报错! --------------------编程问答-------------------- try
{
while (true )
{
allDone.Reset();// Set the event to nonsignaled state.
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
}
}
catch (ThreadAbortException)
{
//在此处时不时弹出来线程被要求中止,监听程序启动后,时间不定,有时候四个小时抛出来,有时候,1个小时就抛,还有时能坚持一天。是什么原因导致??
} --------------------编程问答-------------------- 声明:程序中没有直接使用Abort()来强制关闭线程而引发异常的抛出?大家帮我分析一下原因! --------------------编程问答--------------------
给你分析了,你不仔细看.
这个例子程序,没法外部来关闭你的这个程序,除非你把这段代码扔到线程里面去执行,才能在外部通过对线程关闭,或者对Socket进行关闭.
--------------------编程问答-------------------- http://msdn.microsoft.com/zh-cn/library/fx6588te(v=VS.90).aspx#Y0
基本上就是按照这个例子来编写的,我的程序是需要接受多个客户端连接!
我在global.asax中加入30S定时器,想定时监测线程状态是否为Abort如果被中止,重新New一个新的,启动Socket监听服务,但未能实现。
现在的问题在于:
1、为什么会抛出线程中断的异常,首先我没主动去中止?
2、ThreadAbortException,Catch到异常时,线程的状态是AbortRequested,一直是申请中止状态。如果去处理?
楼上的兄弟可用QQ?方便给我?,沟通一下?
补充:.NET技术 , C#