2

我一直认为 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;

缓冲区初始化有一些开销,但它胜过从网络流中一次读取一个字节,并寻找终止字符或字符串。

TcpClient 没有以更好的方式处理读取数据,即 Socket 的方式,是不是有点奇怪?

4

1 回答 1

1

有些协议有一个固定大小的标头,其中包含有效负载的大小,所以也许这并不奇怪

在您的情况下,您最好Socket直接使用 s ,或者您可以编写一个包装器NetworkStream来读取缓冲区并允许您进入缓冲区以Peek()获取终止字符。

于 2012-06-25T12:52:44.833 回答