【问题标题】: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) 失败。

没有try{}catch{}有什么方法可以编写此代码 - 将GetConnection()重写为:

public void GetConnection()
{
    while ( myList is open && there is no connection)
    {
         //do nothing
    }
    if (myList is open)
    {
         this.socket = myList.AcceptConnection();
    }
}

还是其他方式?谢谢。

【问题讨论】:

标签: c# multithreading sockets tcplistener


【解决方案1】:
socket = myList.AcceptSocket()

是一个阻塞调用,因此如果底层套接字停止侦听,它将引发异常,因此无论如何您都需要一个 try/catch 来进行该阻塞调用。

你可以测试:

if (myList.Server.IsBound)
{
     this.socket = myList.AcceptConnection();
}

这样你就不会阻塞下一个连接,除非套接字正在主动监听。但是就像我说的,如果你希望程序能够在某个时候停止监听,那么当你调用myList.Stop()时,这仍然会引发异常@

【讨论】:

  • 那么就没有办法如前所述重写GetConnection()
  • 没有办法突破 TcpListener::AcceptConnection() 这是一个阻塞调用。一旦您调用该程序,您的程序将停止执行,直到套接字上出现连接或另一个线程关闭侦听套接字。如果另一个线程关闭了套接字,则会抛出异常。
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多