gpt4 book ai didi

C#:无法在 TCP 服务器上接收大数据

转载 作者:可可西里 更新时间:2023-11-01 02:35:04 25 4
gpt4 key购买 nike

我已经创建了一个 TCP 服务器。我面临一个问题。我的 TCP 服务器没有接收到大于 30000 字节的数据。

接收数据的代码

MAX_TCP_DATA = 64000

private void Process()
{
if (client.Connected == true)
{
log.InfoFormat("Client connected :: {0}", client.Client.RemoteEndPoint);
Byte[] bytes = new Byte[MAX_TCP_DATA];
String data = null;
NetworkStream stream = client.GetStream();

int i;

try
{
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// bytes contains received data in byte[].
// Translate data bytes to a UTF-8 string.
byte[] receivedBuffer = new byte[i];
Array.Copy(bytes, receivedBuffer, i);

if (log.IsDebugEnabled)
{
data = System.Text.Encoding.UTF8.GetString(receivedBuffer);
log.InfoFormat("Received MSG ::: " + data);
}

CommEventArgs comEventArg = new CommEventArgs();
comEventArg.data = receivedBuffer;
IPEndPoint remoteIPEndPoint = (IPEndPoint)client.Client.RemoteEndPoint;
comEventArg.srcAddress = remoteIPEndPoint.Address.ToString();
comEventArg.srcPort = remoteIPEndPoint.Port;
comEventArg.length = i;
this.OnDataReceived(comEventArg);
}
}
catch (Exception ex)
{
log.InfoFormat("Client disconnected : {0}", client.Client.RemoteEndPoint);
}
finally
{
client.Close();
}
}
}

当我发送 40000 个字节数组时。我的 TCP 服务器只收到 26280 个字节。

请问是哪里接收有问题

最佳答案

问题是您无法接收任意大小的数据包。我在您的代码中看不到任何指示流协商的内容。 TCP 是一种流协议(protocol),较低级别使用数据包,因为它必须这样做。这意味着您的发送数据被分成任意数据包。接收端数据包大小几乎是随机的(缓冲区中有多少),甚至可能根本无法转换为正确的 UTF8 完全强。

这个:

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)

不是读取客户端发送的所有数据,而是服务器接收到的所有数据。这可能不完整。

您需要进入文档并实际完成您的作业 - 即阅读它。

它说:

The Read operation will read as much data as is available, up to the number of bytes specified by the size parameter.

基本上,目前没有更多的数据。它可能会在一毫秒后出现。这就是为什么你需要知道在处理数据之前要读取多少数据——要么使用你自己的数据包结构(例如在前两个字节中有一个长度标志),要么使用 CLRLF 来指示行尾——所以当你得到一个你知道你以前可以处理所有字节的人。

您在此处采用的简单方法根本行不通,因为数据传输不是即时的。 Read 方法将读取缓存在接收器中的任何内容,您假设这基本上就是全部。

同时,while 不是必须的,除了处理clsoed 套接字。同样,文档有助于:

If no data is available for reading, the NetworkStream.Read method will block until data is available.

因此,除非底层套接字已关闭(然后它应该抛出异常),否则无法返回 0。因为它会等到(一些)数据到达。

提示:阅读文档并不是一件多余的事情。在您的情况下,根据文档,您假设的行为显然完全不存在。

关于C#:无法在 TCP 服务器上接收大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956933/

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