首页 文章

从数据读取TcpClient不如socket

提问于
浏览
3

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

  • 1

    有些协议具有固定大小的标头,其中包含有效负载的大小,因此可能并不奇怪 .

    在你的情况下你可能最好直接使用 Socket ,或者你可以在 NetworkStream 周围写一个包装器,它读入缓冲区并允许你 Peek() 进入终止字符 .

相关问题