2012-06-25 101 views
3

我一直認爲TcpClient可以簡化我的網絡應用程序中的套接字操作。從數據讀取TcpClient劣於套接字

但是,似乎TcpClient需要知道應該從底層套接字讀取多少數據。它看起來像TcpClient.GetStream(..)。Read(..)調用Socket.Receive(..)它讀取指定的字節數。

TcpClient暴露NetworkStream,這可能是相當煩人的處理。類似於終止字符串的東西以及不可靠的DataAvailable屬性使讀取未知TCP「數據包」變得複雜。

使用Socket.ReceiveFrom(..)似乎更「面向數據包」。

我通常使用TcpClient的綁定和握手等等,而對閱讀中,我使用

 Socket socket = _tcpClient.Client; 

     byte[] buffer = new byte[1000]; 

     IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint senderRemote = sender; 

     int length = socket.ReceiveFrom(buffer, ref senderRemote); 

     string replyString = Encoding.ASCII.GetString(buffer, 0, length); 

     return replyString; 

一些開銷與緩衝區初始化,但它打敗離的NetworkStream一次讀取一個字節,並尋找終止字符或字符串。

TcpClient不能以更好的方式處理讀取數據,例如Socket的方式,這難道不奇怪嗎?

回答

1

有協議有一個固定大小頭包含有效載荷的大小,所以也許這不是奇怪。

在你的情況,你可能會更好使用直接Socket S,或者你可以寫一個NetworkStream的包裝讀取到緩衝區中,並允許您Peek()到它的終止符。