Os bytes que meu programa servidor recebe estão incompletos. Por quê? Estou usando soquetes C # .net

Isso nem sempre acontece. Mas isso acontece com mais frequência do que receber os bytes completament

É assim que o meu cliente prog envia bytes para o meu servidor prog:

public void sendBytes()
{
    FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    TcpClient cli = tcpServer; //tcpServer is a global TcpClient variable I use to connect to the server. 
    NetworkStream ns = cli.GetStream();

    CopyStreamToStream(fs, ns, null);
    ns.Flush();
}

public static void CopyStreamToStream(Stream source, Stream destination, Action<Stream, Stream, Exception> completed)
{
    byte[] buffer = new byte[0x1000];
    int read;

    while ((read = source.Read(buffer, 0, buffer.Length)) > 0) // <- client loop
        destination.Write(buffer, 0, read);
}

É assim que o meu servidor prog recebe bytes do meu cliente prog:

FileStream ms = new FileStream(tmpFile, FileMode.Create, FileAccess.Write);
do
{
    int szToRead = s.Available; //s is a socket
    byte[] buffer = new byte[szToRead];

    int szRead = s.Receive(buffer, szToRead, SocketFlags.None);
    if (szRead > 0)
        ms.Write(buffer, 0, szRead);            
}
while(s.Available != 0); //i also tried ms.length < size_of_file_to_be_received_in_bytes

@i entrou no programa e observou os valores, e não sei o que causa a falta de bytes recebidos. Não sei se o problema está no programa cliente ou no servido

i não sei se isso é relevante, mas quando tentei entrar no loop do cliente (para observar o valor de fs.length e verificar se ele será recebido no servidor), todas as 4 tentativas de enviar um arquivo do cliente para o servidor foi bem-sucedido. mas quando eu não assisti o loop do cliente e assisti apenas ao aplicativo do servidor (para ver o valor de ms.length), apenas 1 de 4 tentativas de envio de um arquivo para o servidor foi bem-sucedida. nas três tentativas com falha, o comprimento de ms. é menor que os bytes do arquivo de origem (verifiquei na propriedade do arquivo

Est é onde eu baseiei isso em

INFORMAÇÃO ADICIONAL

No código original (do site em que baseiei meu programa), o loop tem uma condição diferente:

FileStream ms = new FileStream(tmpFile, FileMode.Create, FileAccess.Write);
do
{
    int szToRead = s.Available; //s is a socket
    byte[] buffer = new byte[szToRead];

    int szRead = s.Receive(buffer, szToRead, SocketFlags.None);
    if (szRead > 0)
        ms.Write(buffer, 0, szRead);            
}
while(SocketConnected(s)); // <--- i changed this in my program

private static bool SocketConnected(Socket s)
{
    return !(s.Poll(1000, SelectMode.SelectRead) && (s.Available == 0));
}

Acho que o SocketConnected testa se o soquete ainda está conectado porque o código original do programa cliente era o seguinte:

CopyStreamToStream(fs, ns, null);
ns.Flush();
ns.Close();

i removeu o ns.Close () do programa porque desejo manter a conexão do aplicativo cliente com o servidor. Então, eu quero poder verificar se acabei de ler todos os bytes provenientes do aplicativo cliente sem fechar a conexão do soquete do lado do client

questionAnswers(2)

yourAnswerToTheQuestion