2012-06-25 36 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()到它的终止符。