有啥方法可以检查套接字连接是不是可用?
Posted
技术标签:
【中文标题】有啥方法可以检查套接字连接是不是可用?【英文标题】:Is there any way to check if socket connection is available?有什么方法可以检查套接字连接是否可用? 【发布时间】:2020-04-19 05:48:58 【问题描述】:我有以下代码:
class MyServer
TcpListener myList;
Socket socket;
public MyServer(string ip)
this.myList = new TcpListener(ip, 12001);
this.myList.Start();
Thread t = new Thread(new ThreadStart(GetConnection));
t.Start();
public void GetConnection()
try
socket = myList.AcceptSocket(); //(1)
catch
Console.WriteLine("Error");
public void StopListening()
this.myList.Stop();
它运行良好:我启动服务器,如果我“后悔”我调用 StopListening()(在建立连接之前!)并且因为我关闭了 myList,(1) 失败。
没有trycatch有什么方法可以编写此代码 - 将GetConnection()重写为:
public void GetConnection()
while ( myList is open && there is no connection)
//do nothing
if (myList is open)
this.socket = myList.AcceptConnection();
还是其他方式?谢谢。
【问题讨论】:
这能回答你的问题吗? How to check if a socket is connected/disconnected in C#? 没有。该链接是关于检查套接字是否还活着,我问是否有一个套接字挂起。 【参考方案1】:socket = myList.AcceptSocket()
是一个阻塞调用,因此如果底层套接字停止侦听,它将引发异常,因此无论如何您都需要一个 try/catch 来进行该阻塞调用。
你可以测试:
if (myList.Server.IsBound)
this.socket = myList.AcceptConnection();
这样你就不会阻塞下一个连接,除非套接字正在主动监听。但是就像我说的,如果你希望程序能够在某个时候停止监听,那么当你调用myList.Stop()
时,这仍然会引发异常@
【讨论】:
那么就没有办法如前所述重写GetConnection()
?
没有办法突破 TcpListener::AcceptConnection() 这是一个阻塞调用。一旦您调用该程序,您的程序将停止执行,直到套接字上出现连接或另一个线程关闭侦听套接字。如果另一个线程关闭了套接字,则会抛出异常。以上是关于有啥方法可以检查套接字连接是不是可用?的主要内容,如果未能解决你的问题,请参考以下文章
Docker:有啥方法可以列出正在运行的 docker 容器中打开的套接字?