C# Socket.Receive()返回的数据量不正确

C# Socket.Receive()返回的数据量不正确,c#,file,sockets,upload,send,C#,File,Sockets,Upload,Send,作为学校项目,我正在创建一个文件共享应用程序。 我向服务器发送我想要的所有消息,一切都很好,但是当要将文件上载到服务器时,文件从来都不是它应该的样子。我调试了应用程序,发现套接字没有返回正确的字节数。 我不知道这是否正确,但我认为这是错误的。 例如,当我上传一个小的.txt文件,并用Notepad++打开它时,我看到文件末尾有很多空值,这意味着我写的比应该写的要多。我在互联网上搜索了它,在codeplex上找到了一个应用程序,它的功能与我现在做的相同,但套接字返回的数据量是正确的 如果有人能帮助

作为学校项目,我正在创建一个文件共享应用程序。 我向服务器发送我想要的所有消息,一切都很好,但是当要将文件上载到服务器时,文件从来都不是它应该的样子。我调试了应用程序,发现套接字没有返回正确的字节数。 我不知道这是否正确,但我认为这是错误的。 例如,当我上传一个小的.txt文件,并用Notepad++打开它时,我看到文件末尾有很多空值,这意味着我写的比应该写的要多。我在互联网上搜索了它,在codeplex上找到了一个应用程序,它的功能与我现在做的相同,但套接字返回的数据量是正确的

如果有人能帮助我,我将不胜感激。 对不起,如果英语糟透了,那不是我的母语

处理第一条消息并接收clint连接的服务器函数:

    public void Brodcast()
    {
        tcpListener.Start();
        while (true)
        {
            try
            {
                ClientSocket = tcpListener.AcceptSocket();
                MessageReceiving();
            }
            catch { }
        }
    }

    public void MessageReceiving()
    {
        if (ClientSocket.Connected)
        {
            OpenPackage.MessageTypeToBytes RSMessage = new OpenPackage.MessageTypeToBytes();
            ClientSocket.Receive(RSMessage.MessageBytes, 512, SocketFlags.None);
            if (RSMessage.TypeOfMessage == MessageType.Login)
                DoLogin();
            else if (RSMessage.TypeOfMessage == MessageType.Download)
                SendFile();
            else if (RSMessage.TypeOfMessage == MessageType.Upload)
                ReceiveFile();
            else if (RSMessage.TypeOfMessage == MessageType.NConta)
                NewAccount();
            else if (RSMessage.TypeOfMessage == MessageType.Search)
                SearchResult();
            else if (RSMessage.TypeOfMessage == MessageType.Apagar)
                DeleteFile();
        }
    }
服务器:

    public void ReceiveFile()
    {
        try
        {
            byte[] MessageBytes = new byte[512];
            ClientSocket.Receive(MessageBytes, 512, SocketFlags.None);
            string Nickname = Encoding.ASCII.GetString(MessageBytes);
            string[] CNickFich = Nickname.Split('$');
            FileHandler Handler = new FileHandler();
            long DirectorySize = Handler.GetDirectorySize("C:\\" + CNickFich[0]);
            long FileSize = long.Parse(CNickFich[2]);
            bool Subs = false;
            if ((FileSize + DirectorySize) < MaxFolderSize && MaxFileSize > FileSize)
            {
                if (!Directory.Exists("C:\\" + CNickFich[0]))
                    Directory.CreateDirectory("C:\\" + CNickFich[0]);
                if (File.Exists("C:\\" + CNickFich[0] + "\\" + CNickFich[1]))
                {
                    File.Delete("C:\\" + CNickFich[0] + "\\" + CNickFich[1]);
                    Subs = true;
                }
                MessageTypeToBytes MessageInBytes = new MessageTypeToBytes() { TypeOfMessage = MessageType.OK };
                ClientSocket.Send(MessageInBytes.MessageBytes, 512, SocketFlags.None);

                int qtdReceived = 0;
                long CurrentSize = 0;
                byte[] FileBuffer = new byte[BufferSize];
                FileStream FileStr = new FileStream("C:\\" + CNickFich[0] + "\\" + CNickFich[1], FileMode.CreateNew, FileAccess.Write);
                BufferedStream BufferStr = new BufferedStream(FileStr);
                while (CurrentSize < FileSize)
                {
                    qtdReceived = ClientSocket.Receive(FileBuffer, 0, FileBuffer.Length, 0);
                    CurrentSize += qtdReceived;
                    BufferStr.Write(FileBuffer, 0, qtdReceived);
                    BufferStr.Flush();
                }
                BufferStr.Close();
                FileStr.Close();
                SqlDataAdapter data = new SqlDataAdapter("SELECT COD_CONTA FROM CONTAS WHERE NICKNAME='"
                + CNickFich[0] + "'", OConn);
                DataTable dt = new DataTable();
                data.Fill(dt);
                if (NFicheiro(Handler.MD5HashFromFile("C:\\" + CNickFich[0] + "\\" + CNickFich[1]), "C:\\" + CNickFich[0] + "\\" + CNickFich[1], Subs,
                    int.Parse(dt.Rows[0][0].ToString()), CNickFich[3]))
                    MessageInBytes.TypeOfMessage = MessageType.OK;
                else
                    MessageInBytes.TypeOfMessage = MessageType.Erro;
                ClientSocket.Send(MessageInBytes.MessageBytes, 512, SocketFlags.None);
                //NFicheiro(new FileHandler().MD5HashFromFile("C:\\" + CNickFich[0] + "\\" + CNickFich[1]), "C:\\" + CNickFich[0], false, 1, );
            }
            else
            {
                MessageTypeToBytes MessageInBytes = new MessageTypeToBytes() { TypeOfMessage = MessageType.Erro };
                ClientSocket.Send(MessageInBytes.MessageBytes, 512, SocketFlags.None);
            }
        }
        catch
        {
            MessageTypeToBytes MessageInBytes = new MessageTypeToBytes() { TypeOfMessage = MessageType.Erro };
            ClientSocket.Send(MessageInBytes.MessageBytes, 512, SocketFlags.None);
        }
    }

您使用的是缓冲区长度,而不是发送时读取的长度。

您使用的是缓冲区长度,而不是发送时读取的长度。

您发送的数据太多了。。。在文件末尾,
FileBytes
将不再完全满,您应该只发送
qtdrard
字节

替换

Program.CTasks.ClientSocket.Send(FileBytes, 0, FileBytes.Length, 0);


你发送的数据太多了。。。在文件末尾,
FileBytes
将不再完全满,您应该只发送
qtdrard
字节

替换

Program.CTasks.ClientSocket.Send(FileBytes, 0, FileBytes.Length, 0);


不要介意与sql的连接,它只用于将文件添加到帐户。不要介意与sql的连接,它只用于将文件添加到帐户。感谢booth提供的快速答案。我测试了它,它工作了!谢谢booth的快速回答。我测试了它,它工作了!
Program.CTasks.ClientSocket.Send(FileBytes, 0, qtdRead, 0);