2

socket.connect() 関数を停止するという問題に直面しています。ローカル マシンとリモート マシン間の物理リンクは良好な場合がありますが、何らかの理由でリモート エンドポイントにアクセスできません。ファイアウォールまたはリモート マシンのポートが閉じている可能性があります。そのような場合、socket.connection() 関数はそこにスタックし、無限に長い時間待機します...後でファイアウォールを無効にしても、関数はそこに永遠にスタックします。

そのため、上記の状況に直面したときに socket.connect() を停止する方法を見つけようとしました。

問題は、タイムアウトメカニズム、タスク、または socket.beginconnect(); を持たない .net マイクロフレームワークを使用していることです。

私は 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  
    }
4

2 に答える 2

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");
于 2013-01-31T22:17:20.233 に答える