gpt4 book ai didi

c# - 读取数据 TcpClient 不如 socket

转载 作者:行者123 更新时间:2023-11-30 17:59:29 25 4
gpt4 key购买 nike

我的印象是 TcpClient 会简化我的网络应用程序中的套接字操作。

但是,TcpClient 似乎需要知道应该从底层套接字读取多少数据。看起来 TcpClient.GetStream(..).Read(..) 调用 Socket.Receive(..) 读取指定的字节数。

TcpClient 公开了一个 NetworkStream,处理起来可能会很烦人。诸如终止字符串和不可靠的 DataAvailable 属性之类的东西使得未知 TCP“数据包”的读取变得复杂。

使用 Socket.ReceiveFrom(..) 似乎更加面向“数据包”。

我通常使用TcpClient来绑定(bind)和握手等,阅读我使用

        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 的方式)处理读取数据是不是有点奇怪?

最佳答案

有些协议(protocol)有一个固定大小的 header ,其中包含有效载荷的大小,所以也许这并不奇怪。

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

关于c# - 读取数据 TcpClient 不如 socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11187917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com