2009-08-27 48 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 2009-09-02 08:17:28

+0

我已經更新了關於線程池的信息。如果您發現新增加的信息有用,請將其標記爲答案。 – 2009-09-03 14:29:07

相關問題