示例#1
0
        public static bool SendMessage(IPEndPoint endPoint, short idDispositivo, byte[] mensaje, string filename)
        {
            const byte op       = 0x01;
            var        filesize = mensaje.GetLength(0);
            var        result   = false;

            try
            {
                TRACE(endPoint, "=== inciando cliente ===");
                var socket = new TcpClient();
                socket.Connect(endPoint);
                TRACE(endPoint, "Se ha conectado el socket TCP/IP");
                var buff = new byte[71];
                // ponemos a cero.
                for (var i = 0; i < 71; ++i)
                {
                    buff[i] = 0x00;
                }
                var pos = 0;
                Decoder.EncodeShort(ref buff, ref pos, idDispositivo);
                Decoder.EncodeByte(ref buff, ref pos, op);
                Decoder.EncodeInteger(ref buff, ref pos, filesize);
                var b = Encoding.ASCII.GetBytes(filename);
                Array.Copy(b, 0, buff, pos, b.GetLength(0));
                socket.Client.Send(buff);
                TRACE(endPoint, "Cabeceras enviadas");
                var total = 0;
                var r     = socket.Client.Send(mensaje, mensaje.GetLength(0), SocketFlags.None);
                total += r;
                TRACE(endPoint, "mensaje enviado {0} bytes.", total);
                var ack = new byte[1];
                ack[0] = Convert.ToByte('N');
                try
                {
                    if (socket.Client.Receive(ack, 0, 1, SocketFlags.None) == 1)
                    {
                        try
                        {
                            socket.Client.Shutdown(SocketShutdown.Send);
                            socket.Client.Close();
                        }
                        // ReSharper disable EmptyGeneralCatchClause
                        catch
                        // ReSharper restore EmptyGeneralCatchClause
                        {
                        }
                        if (ack[0] == 'A')
                        {
                            TRACE(endPoint, "ACK Recibido", endPoint);
                            return(result = true);
                        }
                        TRACE(endPoint, "NACK Recibido", endPoint);
                    }
                    TRACE(endPoint, "No se recibio respuesta valida");
                    return(false);
                }
                catch (Exception e)
                {
                    T.EXCEPTION(e, "FileClient.Push WAIT FOR ACK/NACK PHASE");
                }
                return(result = false);
            } catch (Exception e)
            {
                T.ERROR("Exception en FileClient: txt={0}", e.Message);
                return(result = false);
            }
            finally
            {
                if (result)
                {
                    SuccesfulSentMessages++;
                }
                else
                {
                    AbortedMessagesSend++;
                }
            }
        }
示例#2
0
            public override void OnReceive(StreamBlock block)
            {
                // agregarmos al buffer.
                TRACE("datos en buffer={0} recibidos={1}", buffer_position, block.TotalBytes);
                Array.Copy(block.Data, 0, active_buffer, buffer_position, block.TotalBytes);
                buffer_position += block.TotalBytes;
                if (!headers_readed)
                {
                    if (buffer_position >= 71)
                    {
                        // leer la cabecera... podemos
                        // Short            DeviceId
                        // Byte             destination (0x00 = File, 0x01 = Queue)
                        // Integer          Tamaño del Archivo (setea $FileSize)
                        // Bytes[64]        Name de Archivo o Base64MessageQueue segun corresponda (Rellenado con 0)
                        // Bytes[$FileSize] Datos del archivo.
                        var pos = 0;
                        idDispositivo = Decoder.DecodeShort(active_buffer, ref pos);
                        op            = Decoder.DecodeByte(active_buffer, ref pos);
                        chunk_size    = Decoder.DecodeInteger(active_buffer, ref pos);
                        bfilename     = Decoder.DecodeBytes(active_buffer, ref pos, 64);
                        int zpos;
                        for (zpos = 0; zpos < 64; ++zpos)
                        {
                            if (bfilename[zpos] != 0)
                            {
                                continue;
                            }
                        }
                        filename       = Encoding.ASCII.GetString(bfilename, 0, zpos);
                        headers_readed = true;

                        switch (op)
                        {
                        case 0x01:
                            strm = new MemoryStream();
                            break;

                        default:
                            AbortsReceivingMessages++;
                            throw new Exception("UIQS: Tipo de operacion desconocida.");
                        }
                        TRACE("Recibiedo {0}{1} size={2} dev={3}", (op == 0x01 ? "Mensaje para cola=" : "Archivo nombre="), filename, chunk_size, idDispositivo);
                    }
                    else
                    {
                        return;  // aun no leimos suficiente.
                    }
                }
                while (buffer_position > payload_start)
                {
                    T.TRACE(String.Format("UIQS: Recibiedo bloque: size={0}", buffer_position - payload_start));
                    payload_size += buffer_position - payload_start;
                    var data_block = new byte[buffer_position - payload_start];
                    Array.Copy(active_buffer, payload_start, data_block, 0, buffer_position - payload_start);
                    strm.Write(data_block, 0, buffer_position - payload_start);
                    buffer_position = payload_start = 0;
                    if (strm.Length != chunk_size)
                    {
                        continue;
                    }
                    bool local_result;
                    try
                    {
                        local_result = complete_receive();
                    }
                    catch (Exception e)
                    {
                        T.EXCEPTION(e, "RECEIVE DATA");
                        local_result = false;
                    }

                    Send(Encoding.ASCII.GetBytes(local_result ? "A" : "N"), 1);
                    TRACE("Respondo {0} y cierro.", local_result ? "A" : "N");
                    Disconnect();
                }
            }