GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350
原文作者:狐帝
刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦。监听代码是放在一个线程中,当在线程中调用Socket.Accept()函数时,倘若这时需要中止该线程,C#似乎没有提供现成的办法,使用了Thread.Abort()和Thread.Interrupt()函数,都没有用。有人说用异步Accept方法避免阻塞,可是用这种方法就得在线程中不停地轮询Socket的状态,会导致CPU负荷增加。还有人提出可以现在程序内部创建一个对侦听Socket的连接,然后发送特定的推出数据序列,当监听程序收到这个特殊序列后就主动结束线程。这个方法虽然可以解决问题,但是未免复杂了些。
想来想去,突然想到如果将监听socket关闭掉,引发socket异常,然后在监听线程中捕获这个异常不就可以中止监听线程了吗,试验了一下,果然可以。监听线程的代码如下:
- using System;
 - using System.IO;
 - using System.Net.Sockets;
 - using System.Net;
 - public class ListenThread
 - {
 - public void run()
 - {
 - Console.Write("creating listen socket ...");
 - listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 - listenSocket.Bind(new IPEndPoint(IPAddress.Any, 65365));
 - listenSocket.Listen(0);
 - Console.Write(" done.\n");
 - try
 - {
 - Console.Write("listening ...");
 - ioSocket = listenSocket.Accept();
 - Console.Write(" accepted.\n");
 - Console.Write("creating I/O thread ...");
 - // new Thread(new ThreadStart(this.networkIOThreadProc)).Start();
 - Console.Write(" done.\n");
 - }
 - catch (Exception e)
 - {
 - Console.WriteLine("Thread aborted.");
 - }
 - finally
 - {
 - Console.WriteLine("Thread resource released.");
 - }
 - }
 - public void stop()
 - {
 - if (listenSocket != null)
 - {
 - listenSocket.Close();
 - }
 - }
 - private Socket listenSocket = null;
 - private Socket ioSocket = null;
 - }
 
创建线程的代码如下:
- ListenThread listener = new ListenThread();
 - Thread listenThread = new Thread(new ThreadStart(listener.run));
 - listenThread.Start();
 
中止线程的代码如下:
- listener.stop();
 
调用线程类的stop函数之后,会将处于监听远程连接的listenSocket关闭掉,这时会导致引发System.Net.Sockets.SocketException,在线程代码中捕获并处理这个异常就行了。这种方法实现简单,也不会产生额外的CPU资源。
GJM : 中断被Socket.Accept阻塞的线程的更多相关文章
- Python Socket单线程+阻塞模式
		
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
 - 一步一步从原理跟我学邮件收取及发送 9.多行结果与socket的阻塞
		
前几篇的文章发表后,有网友留言说没有涉及到阻塞的问题吗?在 socket 的编程当中,这确实是个很重要的问题.结合目前我们文章的内容进度,我们来看看为什么说阻塞概念很重要. 接着上篇的内容,当我们发送 ...
 - c++之socket,阻塞模式
		
这里描述下socket的阻塞模式: 首先,socket有几个函数 socket() 创建socket bind() 绑定socket到一个地址 listen() 开启soket监听 accept() ...
 - linux 客户端 Socket 非阻塞connect编程
		
开发测试环境:虚拟机CentOS,windows网络调试助手 非阻塞模式有3种用途 1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...
 - socket的阻塞与非阻塞,同步与非同步
		
网络编程中通常提到四种方式,同步/异步,阻塞/非阻塞.以下对它们的概念进行总结 1.同步/异步:主要针对C端 同步:所谓同步,就是在C端发出一个功能调用时,在没有得到结果之前,调用不返回,也就是必须一 ...
 - socket的阻塞与非阻塞,同步与异步
		
同步/异步主要针对C端: 同步: 所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步 ...
 - confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
		
https://www.cnblogs.com/heyongboke/p/9806396.html 1.confluence中报错信息如下: 严重 [http-nio-18090-Acceptor-0 ...
 - socket编程-阻塞和非阻塞
		
转自:https://www.cnblogs.com/sunziying/p/6501045.html 建立连接 阻塞方式下,connect首先发送SYN请求道服务器,当客户端收到服务器返回的SYN的 ...
 - accept阻塞
		
一直以来以为accept阻塞的时候,若另有线程关闭相应的监听套接字,accept会立即返回. 今天先是在NDK上试,没反应.又在ARCHLINUX试了下,还是没反应.难道是我一直记的都是错的!!!!! ...
 
随机推荐
- ls /usr/linkapp 没反应
			
ls /usr/linkapp ll /usr/linkapp 都是一样无反应 没有任何反应, ctrl + c / ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...
 - angularjs 2.0 快速案例(1)
			
前言 上一节我们已经把环境给搭建起来了,现在我们通过一个快速案例把angular 2.0 初步了解一下,后续我们会深入每一个细节,这个案例主要是一个[英雄(Hero)]列表的展示,创建,编辑.这个案例 ...
 - 2013 duilib入门简明教程 -- 简单控件介绍 (12)
			
前面的教程应该让大家对duilib的整体有所映像了,下面就来介绍下duilib具体控件的使用. 由于官方没有提供默认的控件样式,所以我就尽量使用win7或者XP自带的按钮样式了,虽然界 ...
 - PHP设计模式笔记
			
一.工厂模式:减少new的使用,定义一个类,专门用来创建其它对象例: class A{ static function create(){ return new DB(); } } $db = A:: ...
 - KnockoutJS 3.X API 第七章 其他技术(4) 速率限制
			
注意:这个速率限制API是在Knockout 3.1.0中添加的. 通常,更改的observable立即通知其订户,以便依赖于observable的任何计算的observable或绑定都会同步更新. ...
 - 查看Validate Subscription 的结果
			
Sql Server Replication Monitor 提供一个feature,能够verify Replication的 Publication 和 Subscription 的数据同步sta ...
 - 应用程序框架实战三十六:CRUD实战演练介绍
			
从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...
 - 如何搭建Percona XtraDB Cluster集群
			
一.环境准备 主机IP 主机名 操作系统版本 PXC 192.168.244.146 node1 ...
 - 初识MongoDB
			
1. 初识 接触MongoDB,是由于最近在工作中用到了MongoDB做数据存储.之前也听说过这个NoSQL数据库,但是一直没有尝试去使用它做开发.这次趁着这个机会,想好好学习下这个NoSQL数据库. ...
 - iOS开发多线程篇—多线程简单介绍
			
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...