File Transfer Socket c #

1

I have the following situation, I need to transfer an xml from one application to another via the Socket network I mounted the client and server which I will post below, The file is transmitted without problems, but files with

asked by anonymous 30.05.2017 / 23:30

2 answers

1

I did this, I do not know if it would be the right one but it was the only one that solved the problem, as the problem was files that exceeded 6kbs I instead of sending the whole file, I broke it in "Packages" of 6kbs and on sent separately, At the end I unite the parts and the file arrives 100%, Follow:

CLIENT:

//Coneta com o Cliente
                clientSock.Connect(ipEnd);

                #region ENVIO
                //Pega o tamanho total do arquivo e envia para o servidor
                var tamanho = Encoding.UTF8.GetBytes(xml.Length.ToString());

                //Envia o tamanho do arquivo ao servidor
                clientSock.Send(tamanho);

                //Aguarda a confirmação de recebimento
                clientSock.Receive(new byte[1024*5000]);

                //Indice inicial do substring
                var startIndex = 0;

                //Total restante a ser enviado
                var restante = xml.Length;

                //Envia os pacotes
                while (restante > 0)
                {
                    //Se o restante for maior que 6kbs
                    if (restante > 6144)
                    {
                        //Quebra a string em 6kb
                        var pacote = xml.Substring(startIndex, 6144);

                        //Incrementa o indice do substring
                        startIndex += 6144;

                        //Abate do restante ja enviado
                        restante = restante - pacote.Length;

                        //Envia o pacote
                        clientSock.Send(Encoding.UTF8.GetBytes(pacote));

                        //Recebe resposta confirmação
                        clientSock.Receive(new byte[1024*5000]);
                    }
                    else
                    {
                        //Pega o restante ou total se arquivo menor que 6kbs
                        var pacote = xml.Substring(startIndex, restante);
                        //Abate do restante
                        restante = restante - pacote.Length;
                        //Envia o pacote
                        clientSock.Send(Encoding.UTF8.GetBytes(pacote));
                        //Recebe resposta confirmação
                        clientSock.Receive(new byte[1024 * 5000]);
                    }
                }

SERVER:

using (Socket clientSock = sock.Accept())
                            {

                                //Buffer de recebimento
                             byte[] clientData = new byte[1024*5000];

                            //Recebe o tamanho total esperado
                            clientSock.Receive(clientData);

                            WriteLog("Recebendo dados cliente...");

                            //Retorna confirmação de recebimento
                            clientSock.Send(Encoding.UTF8.GetBytes("true"));

                            //Recebe o tamanho total do arquivo que esta sendo recebido
                            var tamanho = int.Parse(Encoding.UTF8.GetString(clientData).Replace("
//Coneta com o Cliente
                clientSock.Connect(ipEnd);

                #region ENVIO
                //Pega o tamanho total do arquivo e envia para o servidor
                var tamanho = Encoding.UTF8.GetBytes(xml.Length.ToString());

                //Envia o tamanho do arquivo ao servidor
                clientSock.Send(tamanho);

                //Aguarda a confirmação de recebimento
                clientSock.Receive(new byte[1024*5000]);

                //Indice inicial do substring
                var startIndex = 0;

                //Total restante a ser enviado
                var restante = xml.Length;

                //Envia os pacotes
                while (restante > 0)
                {
                    //Se o restante for maior que 6kbs
                    if (restante > 6144)
                    {
                        //Quebra a string em 6kb
                        var pacote = xml.Substring(startIndex, 6144);

                        //Incrementa o indice do substring
                        startIndex += 6144;

                        //Abate do restante ja enviado
                        restante = restante - pacote.Length;

                        //Envia o pacote
                        clientSock.Send(Encoding.UTF8.GetBytes(pacote));

                        //Recebe resposta confirmação
                        clientSock.Receive(new byte[1024*5000]);
                    }
                    else
                    {
                        //Pega o restante ou total se arquivo menor que 6kbs
                        var pacote = xml.Substring(startIndex, restante);
                        //Abate do restante
                        restante = restante - pacote.Length;
                        //Envia o pacote
                        clientSock.Send(Encoding.UTF8.GetBytes(pacote));
                        //Recebe resposta confirmação
                        clientSock.Receive(new byte[1024 * 5000]);
                    }
                }
", string.Empty)); //Arquivo xml para armazenar os pacotes ja em string var xml = ""; //Recebe os dados e monta o xml while (tamanho > 0) { //Recebe o pacote var pacote = clientSock.Receive(clientData); //Incrementa na string (Uni os pacotes) o valore recebido xml += Encoding.UTF8.GetString(clientData).Replace("
using (Socket clientSock = sock.Accept())
                            {

                                //Buffer de recebimento
                             byte[] clientData = new byte[1024*5000];

                            //Recebe o tamanho total esperado
                            clientSock.Receive(clientData);

                            WriteLog("Recebendo dados cliente...");

                            //Retorna confirmação de recebimento
                            clientSock.Send(Encoding.UTF8.GetBytes("true"));

                            //Recebe o tamanho total do arquivo que esta sendo recebido
                            var tamanho = int.Parse(Encoding.UTF8.GetString(clientData).Replace("%pre%", string.Empty));

                            //Arquivo xml para armazenar os pacotes ja em string
                            var xml = "";

                            //Recebe os dados e monta o xml
                            while (tamanho > 0)
                            {
                                //Recebe o pacote
                                var pacote = clientSock.Receive(clientData);

                                //Incrementa na string (Uni os pacotes) o valore recebido
                                xml += Encoding.UTF8.GetString(clientData).Replace("%pre%", string.Empty);

                                //Abate do total ja recebido
                                tamanho -= pacote;

                                //Limpa o buffer
                                clientData = new byte[1024*5000];

                                //Envia ao cliente a confirmação de recebimento
                                clientSock.Send(Encoding.UTF8.GetBytes("true"));
                            }
   }
", string.Empty); //Abate do total ja recebido tamanho -= pacote; //Limpa o buffer clientData = new byte[1024*5000]; //Envia ao cliente a confirmação de recebimento clientSock.Send(Encoding.UTF8.GetBytes("true")); } }

I tested uploader file with more than 1MB and it worked perfectly.

    
02.06.2017 / 23:37
1

I have something similar, but the information is different. I use MLLP to transfer the files completely. Here's the implementation:

public class SiMLLP
{
    private static byte[] StartBlock = new byte[] { 0x0B };
    private static byte[] EndBlock = new byte[] { 0x1C, 0x0D };
    private static byte[] ACK = new byte[] { 0x0B, 0x06, 0x1C, 0x0D };
    private static byte[] NAK = new byte[] { 0x0B, 0x15, 0x1C, 0x0D };

    private Stream _stream;
    private bool _version3;

    public SiMLLP(Stream stream, bool version3)
    {
        _stream = stream;
        _version3 = version3;
    }

    public bool Send(string message)
    {
        byte[] bytes = Encoding.ASCII.GetBytes(message);
        _stream.Write(StartBlock, 0, StartBlock.Length);
        _stream.Write(bytes, 0, bytes.Length);
        _stream.Write(EndBlock, 0, EndBlock.Length);
        _stream.Flush();
        if (_version3)
        {
            byte[] rsp = new byte[4];
            if (_stream.Read(rsp, 0, 4) != 4)
                return false;
            return rsp[1] == 0x06;
        }
        return true;
    }

    public string Receive()
    {
        int ib = 0x00;
        MemoryStream ms = new MemoryStream();
        for (; _stream.ReadByte() != 0x0B; ) ;
        while (true)
        {
            if (ib == 0x1C)
            {
                ib = _stream.ReadByte();
                if (ib == 0x0D)
                    break;
                ms.WriteByte(0x1C);
                ms.WriteByte((byte)ib);
            }
            else
            {
                ib = _stream.ReadByte();
                if (ib != 0x1C)
                    ms.WriteByte((byte)ib);
            }
        }
        if (_version3)
        {
            _stream.Write(ACK, 0, ACK.Length);
            _stream.Flush();
        }
        return Encoding.ASCII.GetString(ms.ToArray());
    }
}

Usage:

        NetworkStream _stream = this.TCPClient.GetStream();
        SiMLLP mllp = new SiMLLP(_stream, false);
        //Enquanto a flag _running estiver como true, e o client conectado
        while (_running && this.TCPClient.Connected)
        {
            try
            {
                if (_stream.DataAvailable)
                {
                    //Aqui será retornada a mensagem completa, independente do tamanho dela
                    string msgRecebida = mllp.Receive();

                    if (!String.IsNullOrEmpty(msgRecebida))
                    {
                       //Processa a mensagem

                       //Aqui envio qualquer mensagem de retorno
                       mllp.Send("ACK");
                    }
                 }
                 ...
              }
              catch{}
              ...
        }
    
31.05.2017 / 00:17