现在的位置: 首页 > 综合 > 正文

一个封锁操作被对WSACancelBlockingCall的调用中断(在线)

2017年10月20日 ⁄ 综合 ⁄ 共 1715字 ⁄ 字号 评论关闭

投资万千种,关键在于实践和自身努力,几种证书挂靠挣钱方法,提供给大家,资料和考试科目。可以参见:http://hi.baidu.com/new/gaofeiservice

http://gaofeiservice.ctdisk.com

 问?:
可以接受多个client. 现在连接正常,可以使用,就是Close();时有问题.
部分代码如下:

public QTCPServer(int port, ExecuteCommand executeCommand) //构造函数,启用监听线程
{
this.sessions = new ArrayList ();
this.sessionThreads = new ArrayList ();
this.executeCommand = executeCommand;
this.open = true;
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, port);
this.listener = new TcpListener(ipLocalEndPoint);
this.listener.Start ();
this.server = new Thread ( new ThreadStart ( Run ) );//用来监听的线程;
this.server.Start ();
}

public void Run ()
{
while ( this.open )
{
Socket s=null;
s = this.listener.AcceptSocket();
if (s.Connected)
{
QTCPServerSession session = new QTCPServerSession(s,this.executeCommand);
this.sessions.Add(session);
Thread th = new Thread(new ThreadStart(session.Run)); //在开线程,处理相关事宜.
th.Start();
this.sessionThreads.Add(th);
}
}
}

public void Close ()
{
if ( this.open )
{
this.open = false;
this.listener.Stop();
this.server.Abort ();
this.server.Join();
while (this.sessions.Count > 0)
{
Thread th = (Thread)this.sessionThreads[0];
th.Abort();
th.Join ();
this.sessionThreads.Remove(th);
QTCPServerSession s = (QTCPServerSession)this.sessions[0];
s.Close();
this.sessions.Remove(s);
}
}
}

Close()时,执行到this.server.Abort ();关闭线程时, Run()中的s = this.listener.AcceptSocket();就会报错 "一个封锁操作被对WSACancelBlockingCall的调用中断"

关不掉了.请碰到过此情况的高手指点.
在线.谢谢
答!: 1:
子线程在阻塞式监听, 主线程想stop. 是不是不行?
答!: 3:
楼主使用互斥锁试试
答!: 4:
我发现 s = this.listener.AcceptSocket(); 这句在server线程里.

server.Abort() 都没有用啊

调试要Terminate All时 才会正常退出,否则还是会死在server线程里的this.listener.AcceptSocket. Abort都没有用啊,怎么办?
答!: 5:
解决了

先判断tcpListener.Pending() 在阻塞. 没想到清华大学出的书也害人啊.

此贴就当散分贴吧

人人有分

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/king_idea8848/archive/2009/10/15/4675139.aspx

【上篇】
【下篇】

抱歉!评论已关闭.