2011-04-21 152 views
0

我有一個設備帶來了信號捕獲(vilistus)的問題,因爲它的軟件應該在捕獲過程中將數據發送到tcp端口(#123),並且我使用了tcp的ac#代碼監聽器從同一端口接收數據,但程序在命令行的accepttcpclient()被阻止,並且沒有收到數據。從tcp端口接收數據

TcpClient client = this.tcpListener.AcceptTcpClient(); 
+0

你確定你的設備發送數據?嘗試使用Wireshark或其他網絡分析工具來查看網絡上發生了什麼。 – Brandon 2011-04-21 21:29:19

回答

0

這聽起來像一個客戶端沒有連接到監聽器。當您在TcpListener上調用AcceptTcpClient時,應用程序將掛起,等待客戶端連接,這似乎是您遇到的問題。

您可以通過執行BeginAcceptTcpClient來解決此問題,這將釋放應用程序並允許程序在等待客戶端時繼續執行。當客戶端連接,然後委託將被調用,然後就可以開始處理客戶端,讀取數據等,因此,例如:

class Comms 
{ 
    TcpListener listener; 
    TcpClient client; 

    // Starts listening for a tcp client 
    public void StartListener() 
    { 
     listener = new TcpListener(IPAddress.Any, 123); 
     listener.BeginAcceptTcpClient(new AsyncCallback(ClientCallback), listener); 
    } 

    // Callback for when a client connects on the port 
    void ClientCallback(IAsyncResult result) 
    { 
     listener = (TcpListener)result.AsyncState; 
     try 
     { 
      client = listener.EndAcceptTcpClient(result); 
      // From here you can access the stream etc and read data 
     } 
     catch (IOException e) 
     { 
      // Handle any exceptions here 
     } 
    } 
} 

提供了客戶端連接正確,那麼你將可以自由地訪問客戶的NetworkStream和然後讀取和寫入數據到客戶端。下面是一個快速參考和示例,你可以看看: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx

當涉及到數據的讀取和寫入時,您將遇到與客戶端的NetworkStream讀取和寫入功能類似的鎖定問題。對於這個問題有兩種可能的解決方案:

  1. 設置超時的讀寫功能,通過設置的NetworkStream的ReadTimeout和WriteTimeout性能。

  2. 通過使用NetworkStream中的BeginRead和BeginWrite函數,使用與BeginAcceptTcpClient類似的回調方法。

個人而言,我更喜歡第二個選項爲第一,直到發生超時不會釋放程序,但他們都是可行的選擇,它取決於你更願意執行哪一個。你可以去這裏瞭解更多有關的NetworkStream的更多信息: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx

希望這有助於

0

這聽起來很奇怪的是,該設備正在客戶端。你確定你不應該使用tcpClient.Connect()到端口123上的設備嗎?

爲什麼?

  1. 設備應該如何知道您的服務器正在運行?它不能嘗試永遠連接。
  2. 設備如何知道端口123對於您的PC中的應用程序是免費的?