我有一個設備帶來了信號捕獲(vilistus)的問題,因爲它的軟件應該在捕獲過程中將數據發送到tcp端口(#123),並且我使用了tcp的ac#代碼監聽器從同一端口接收數據,但程序在命令行的accepttcpclient()
被阻止,並且沒有收到數據。從tcp端口接收數據
TcpClient client = this.tcpListener.AcceptTcpClient();
我有一個設備帶來了信號捕獲(vilistus)的問題,因爲它的軟件應該在捕獲過程中將數據發送到tcp端口(#123),並且我使用了tcp的ac#代碼監聽器從同一端口接收數據,但程序在命令行的accepttcpclient()
被阻止,並且沒有收到數據。從tcp端口接收數據
TcpClient client = this.tcpListener.AcceptTcpClient();
這聽起來像一個客戶端沒有連接到監聽器。當您在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讀取和寫入功能類似的鎖定問題。對於這個問題有兩種可能的解決方案:
設置超時的讀寫功能,通過設置的NetworkStream的ReadTimeout和WriteTimeout性能。
通過使用NetworkStream中的BeginRead和BeginWrite函數,使用與BeginAcceptTcpClient類似的回調方法。
個人而言,我更喜歡第二個選項爲第一,直到發生超時不會釋放程序,但他們都是可行的選擇,它取決於你更願意執行哪一個。你可以去這裏瞭解更多有關的NetworkStream的更多信息: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx
希望這有助於
這聽起來很奇怪的是,該設備正在客戶端。你確定你不應該使用tcpClient.Connect()
到端口123上的設備嗎?
爲什麼?
你確定你的設備發送數據?嘗試使用Wireshark或其他網絡分析工具來查看網絡上發生了什麼。 – Brandon 2011-04-21 21:29:19