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++; } } }
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(); } }