2014-03-18 100 views
2

我正在與TCP客戶端一起學習如何在VS2010 C#中使用TCPSocket函數。我可以調用read()函數來讀取數據。這部分全部有效。我不理解的是如何設置客戶端來監聽流,並將傳入的數據發送到文本框,而無需手動調用該函數或使用計時器。我想用事件處理程序處理這個問題,但是現在我已經完全搞糊塗了,現在我需要一些指導。使用事件處理程序接收TCP客戶端數據

我正在使用我在MSDN上找到的客戶端示例來幫助我理解該函數如何工作以進行基本讀取。

private static void Receive(Socket client) { 
    try { 
     // Create the state object. 
     StateObject state = new StateObject(); 
     state.workSocket = client; 

     // Begin receiving the data from the remote device. 
     client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
      new AsyncCallback(ReceiveCallback), state); 
    } catch (Exception e) { 
     Console.WriteLine(e.ToString()); 
    } 
} 

上的其他計算器後,我發現馬特·戴維斯提供了一種利用公共事件

public event EventHandler<DataRecivedEventArgs> DataRecieved; 

但是當我試了一下,「DataRecivedEventArgs」不是視覺工作室的認可功能的example

有人可以幫我解釋一下如何使用TCPclient來一致地監聽數據並在收到一些數據時調用一個函數嗎?

回答

1

對於給定的TCP連接,接收到的數據在內核中緩衝到其緩衝區大小限制(對應用程序不透明)。

當應用程序想要接收數據時,它必須明確地告訴內核需要將多少數據複製到應用程序緩衝區,因爲緩衝區大小不是無限的,並且內核可能比應用程序更快地存儲傳入的有效負載處理(不要忘記你的應用程序定期被搶佔)。

您的應用程序從TCP套接字接收數據的唯一方法是通過recv()recvfrom()recvmsg()系統調用。

對於您的情況,在用戶空間中,您只需調用與這些系統調用對應的函數,以便接收數據。交付是按需設計的。此外,應用程序將不知道數據是否已到達,直到它調用recv(),recvfrom(),recvmsg(),select(),poll()epoll()

注意:我不是C#人員。我知道C和內核內部,這就是它。我只想指出套接字通信背後的概念。