gpt4 book ai didi

c# - 接收到的数据与通过 c sharp 套接字发送的数据不同

转载 作者:行者123 更新时间:2023-12-03 12:06:29 26 4
gpt4 key购买 nike

我正在尝试将文件从客户端发送到服务器,因此我将文件加载到客户端的字节数组中,并通过 send() 方法将其发送到服务器,但接收到的数组不同且更大比发送的数组,我想知道这是否是协议(protocol)问题(但我正在使用 tcp 协议(protocol)来确保错误检测):

客户端代码:

IPAddress ipAddress = new IPAddress(ip);
IPEndPoint ipEnd = new IPEndPoint(ipAddress, 5656);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

FileStream fl = File.Open("pos.xls",FileMode.Open);
byte[] fileData = ReadFully(fl);
fl.Close();

byte[] clientData = new byte[ fileData.Length];
fileData.CopyTo(clientData,0);

curMsg = "Connection to server ...";
clientSock.Connect(ipEnd);

curMsg = "File sending...";
clientSock.Send(clientData);

curMsg = "Disconnecting...";
clientSock.Close();
curMsg = "File transferred.";

服务器代码:
curMsg = "Starting...";
sock.Listen(100);

curMsg = "Running and waiting to receive file.";
byte[] clientData = new byte[1024 * 5000];
while (true)
{
Socket clientSock = sock.Accept();

clientData = new byte[1024 * 5000];

int receivedBytesLen = clientSock.Receive(clientData);
curMsg = "Receiving data...";

FileStream fz = writeFully(clientData);
fz.Close();
curMsg = "Saving file...";

最佳答案

您已定义 clientData = new byte[1024 * 5000]; - 然后你就不要使用 receivedBytesLen .我不记得是否 Receive重载将尽可能多地读取,直到 EOF,或者只是“一些或 EOF”(后者是 Stream.Read 行为),但您必须验证 并使用 receivedBytesLen .

IMO,固定缓冲区的方法本质上是有缺陷的,因为它也不能很好地处理过大的输入。我个人会使用 NetworkStream这里;那么你的整个代码变成:

using(var fz = File.Create(path)) {
networkStream.CopyTo(fz);
}

这里的另一种常见方法是将预期大小作为数据的前缀发送;这样您就可以验证您是否拥有所需的数据。我个人不会使用这些信息在内存中创建正确大小的缓冲区,因为这仍然不允许史诗大小的文件(但是, Stream 可以)。

关于c# - 接收到的数据与通过 c sharp 套接字发送的数据不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039194/

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