如果它卡住了怎么停止socket.connect()函数?

时间:2013-01-31 21:25:08

标签: c# multithreading .net-micro-framework netduino

我遇到了停止socket.connect()函数的问题。 有时我的本地计算机和远程计算机之间的物理链接可能很好,但由于某种原因,无法访问远程端点,可能是防火墙或远程计算机上的端口已关闭。在这种情况下,socket.connection()函数将被卡在那里并等待无限长时间......即使防火墙稍后被禁用,该函数仍将永远停留在那里。

所以当我遇到上述情况时,我试图找到一种方法来阻止socket.connect()。

问题是我正在使用.net微框架,其中我没有超时机制或任务或socket.beginconnect();

我正在尝试使socket.connect()本身成为一个线程,如果(!thread.join(2000))在2秒后尝试中止()它。但是,我不太明白abort()函数,我听说过这是一种不明智的方法,而且事后并不起作用。

现在我不知道该怎么办?有人可以帮忙吗?很多

 main function
 {
 m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Set up socket    
 remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP_add), 30000);
 m_socket.Connect(remoteEndPoint);
 myThread.Start();
        if (!myThread.Join(2000))
         {
          Debug.Print(myThread.ThreadState.ToString());
          myThread.abort();                       
         }
 }

 private static void socket_connect()
    {
        m_socket.Connect(remoteEndPoint);//Connect to remote device  
    }

2 个答案:

答案 0 :(得分:1)

建议忙碌等待Connect呼叫超时。我非常不同意a)哲学和b)WinSock没有提供更好的方法来解决这个常见问题的主张。

这是一个更好的解决方案:

        using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(1000);
                    socket.Close();
                });
            try
            {
                socket.Connect("192.168.2.123", 1234);
            }
            catch (SocketException sex)
            {
                if (sex.ErrorCode == 10038)
                    Console.WriteLine("Timeout");
                else
                    throw;
            }
        }

您自己检测到超时并关闭套接字。该程序运行大约需要1秒,因此超时机制有效。

请注意,上面的代码是演示代码,应该使用计时器,并且不需要比赛。

忙碌等待有什么不对?

  • 维护不好
  • 介绍延迟
  • 许多套接字时的Perf问题。完全不在服务器系统上启动
  • 在客户端上,CPU无法关闭电源并烧毁电池

答案 1 :(得分:0)

如果您的框架支持非阻塞连接,您可以尝试使用此代码。我在Win7中为.net 4写了这个。

        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Console.WriteLine("Trying to connect");
        socket.Blocking = false;
        try
        {
            socket.Connect("8.8.8.8", 5050);
        }
        catch (Exception ex)
        {
            if (ex is SocketException) && ((SocketException)ex).ErrorCode == 10035) // There is a socket problem and this problem is because of being in non-blocking mode? Then this is just a warning
            {
                // Waiting for connection
                int time = 0;
                while (time < 1000) // If it was lower than 1 second
                {
                    // Do what you want
                    if (socket.Connected) // If connected then break
                        break;
                    System.Threading.Thread.Sleep(50); // Wait 50milisec
                    time += 50;
                }
            }
            else
            {
                Console.WriteLine("Failed");
            }
        }

        if (!socket.Connected)
            Console.WriteLine("Aborted");
        else
            Console.WriteLine("Connected");