c# - 套接字文件传输在 C# 中发送不完整的文件

标签 c# .net sockets tcpclient file-transfer

我正在尝试使用 C# (.NET) 进行 Socket 编程。我引用了 codeproject 中的几个示例,但我的文件传输总是发送不完整的数据。

非常非常小的数据可以正常工作,例如 1kB。但较大的文件传输不完整,特别是图像。

这是我的客户端代码,它将文件发送到服务器。 clientData 存储文件的二进制文件。

byte[] fileData = File.ReadAllBytes(filePath + fileName);
            byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
            byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

            fileNameLen.CopyTo(clientData, 0);
            fileNameByte.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileNameByte.Length);

            curMsg = "Connection to server ...";
            clientSock.Connect(ipEnd);
            int count;
            curMsg = "File sending...";
            count = clientSock.Send(clientData);
            MessageBox.Show(count+" "+clientData.Length);

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

虽然这是我的服务器代码,但它接收文件。
                sock.Listen(100);

            curMsg = "Running and waiting to receive file.";
            Socket clientSock = sock.Accept();

            byte[] clientData = new byte[1024 * 5000];

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

            int fileNameLen = BitConverter.ToInt32(clientData, 0);
            string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);

            BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
            bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);

            curMsg = "Saving file...";

            bWrite.Close();
            clientSock.Close();

有趣的是,当我在客户端的“发送”处设置断点时,文件传输正常。当我使用断点时,我正在观察两端的字节数和传输字节匹配,而当我不使用断点时,接收到的字节低于客户端传输的字节。

我究竟做错了什么?

最佳答案

你忘了实现一个协议(protocol)!要使用 TCP,您必须设计和实现一个协议(protocol),该协议(protocol)定义将发送哪些字节以及接收方如何识别消息或协议(protocol)数据元素。你什么都没做。您的接收代码无法知道它是否已接收到整个文件,因为没有协议(protocol)可以告诉它,也没有任何代码可以实现这样的协议(protocol)。所以它当然会出错——它没有办法让它正确。

如果 receivedBytesLen是 1,您的代码严重失败。

关于c# - 套接字文件传输在 C# 中发送不完整的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016793/

相关文章:

python - 识别 ssl/tls python 套接字服务器的数据包交换类型

java - inputStream.read 无法正常工作

c# - ICSharpcode 文本编辑器中的自动换行

c# - RSA 和 PublicKey 与 dotnet 的互操作

c# - 如何将默认 PropertyDescriptor 设置为属性?

.net - .NET AES/Rijndael-重用解密器时解密不一致

objective-c - IOS中的套接字断开

c# - 使用 Task.Unwrap 获取内部任务

c# - 将服务引用添加到共享类的多个 WCF 服务

c# - ClickOnce安装错误