当前位置:编程学习 > C#/ASP.NET >>

如何停止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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,