C#学习笔记(1):中断被Socket.Accept阻塞的线程
来源:互联网 发布:软件制作大师 编辑:程序博客网 时间:2024/05/17 22:43
刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦。监听代码是放在一个线程中,当在线程中调用Socket.Accept()函数时,倘若这时需要中止该线程,C#似乎没有提供现成的办法,使用了Thread.Abort()和Thread.Interrupt()函数,都没有用。有人说用异步Accept方法避免阻塞,可是用这种方法就得在线程中不停地轮询Socket的状态,会导致CPU负荷增加。还有人提出可以现在程序内部创建一个对侦听Socket的连接,然后发送特定的推出数据序列,当监听程序收到这个特殊序列后就主动结束线程。这个方法虽然可以解决问题,但是未免复杂了些。
创建线程的代码如下:
中止线程的代码如下:
调用线程类的stop函数之后,会将处于监听远程连接的listenSocket关闭掉,这时会导致引发System.Net.Sockets.SocketException,在线程代码中捕获并处理这个异常就行了。这种方法实现简单,也不会产生额外的CPU资源。
想来想去,突然想到如果将监听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资源。
- C#学习笔记(1):中断被Socket.Accept阻塞的线程
- C#学习笔记(3) 中断被NamedPipeServer.WaitForConnection()或NamedPipeClientStream.Connect()阻塞的线程
- 网络编程学习笔记(非阻塞accept)
- java 编程思想笔记 中断阻塞的线程
- 线程的阻塞、中断小结
- C#线程阻塞、中断与终止
- 关于socket的Accept阻塞模式的退出方法分析
- 关于accept 返回的socket的阻塞属性
- 利用select函数实现非阻塞式的socket accept
- python的HttpServer出现socket.accept()阻塞卡死
- Socket进程处理被中断的系统调用及Accept函数返回EINTR错误处理
- accept的非阻塞
- 阻塞socket学习-整理笔记
- C# TCP退出Accept阻塞的两种方法
- 线程的中断阻塞与控制
- WINDOWS SOCKET编程中accept出来的新连接是阻塞还是非阻塞
- 如何让socket的accept线程安全退出
- accept不阻塞的原因
- Read-Write-Lock 模式
- SQL每月自然周(中国习惯)
- 实验3-1 赋值操作符
- 文本框输入技巧
- 实验3-2 算术操作符
- C#学习笔记(1):中断被Socket.Accept阻塞的线程
- 《C语言名题精选百则----9》
- android Notification 的使用
- 实验3-3 强制类型转换和自增自减操作符
- 通用32位微控制器新系列新功能
- 使用 presentModalViewController 异常
- Linux 命令记忆
- 实验3-4 函数的使用
- digester二