2009-08-27 12 views
0

TCPプロトコルを介してデバイス[一種のモデム]を接続したいとします。TCPを介してデバイス[モデム]を接続することによって問題が発生する

このデバイスはクライアントと見なすことができます。プログラムの上で をこのデバイスに接続します。プログラムはサーバー上にあり、 には特別なポートがあり、静的IPがあります。

どうすればいいですか?私は、デバイスを接続することはできませんし、私はソケット接続によってハングの問題を解決することはできませんが、

// where ip= 10.0.0.50 and port= 5050, established for the server! 
    TcpListerner listener; 
    if listener!= null) 
     { 
      listener.Stop(); 
     } 
     listener= new TcpListener(ip, port); 
     listener.Start(); 


     Socket socket; 
     if (!listener.Pending()) 
     { 
      IAsyncResult ar = listener.BeginAcceptSocket(new AsyncCallback(DoAcceptSocketCallback), socket); 
      Thread.Sleep(15000); // try to connect in 15 seconds 

      if (socket != null && socket.Connected) 
      { 
       // if socket is connected 
       // put the code here or do nothing 
      } 
      else 
      { 
        if (socket != null) 
        { 
         socket.Close(); 
        } 
        if listener!= null) 
        { 
         listener.Stop(); 
         listener = null; 
        } 

       } 
     } 

    public void DoAcceptSocketCallback(IAsyncResult ar) 
    { 
     try 
     { 
      TcpListener listener = (TcpListener)ar.AsyncState; 

      if (listener != null) 
      { 
       // connected to socket : 
       socket = listener.EndAcceptSocket(ar); 
      } 
     } 
     catch 
     { 
      socket = null; 
     } 
    } 

は、ここに私のコードです。私のフォーム上で何もすることはできませんが、このコードは15秒間接続しようとしています。

答えて

1

私はあなたのコードにいくつかの変更を加えるべきだと思います。クライアントが接続

は、あなたはその後、メインスレッドがアップ立ち往生しないようにクライアントを処理するスレッドを作成することができ、この文

TcpClient client = listener.AcceptTcpClient() 

を使用することによってれるtcpClientオブジェクトを作成します。あなたはすべての接続に一つの新しいスレッドを作成するのではなく、スレッドプールを使用する場合

if (!listener.Pending()) 
{ 
    TcpClient client = listener.AcceptTcpClient(); 
    Thread newThread = new Thread(this.ServeClient); 
    newThread.Start(client); 
} 

その後のスレッド

public static void ServerClient(TcpClient client) 
{ 
    // Do some work 
} 

を処理するための方法は、それが良いだろう。この方法を使用すると、サーバーが処理できる接続の最大数を制御できます。私は大規模なプログラムでそれを使用していないので、この機能についてはあまりよく分かりません。

私はあなたにチェックすることをお勧めします。the Code Project example on Thread Pool

+0

ありがとうManish、それは動作します。 – Cmptrb

+0

私はスレッドプールに関する情報で答えを更新しました。あなたが新しい追加情報が役に立つと分かったら、それをチェックしてください。 –

関連する問題