using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace RecibirArchivos
{
public partial class Form1 : Form
{
Thread trabajo;
bool nextDataFile = false;
string nombreFile;
public Form1()
{
InitializeComponent();
}
delegate void SetTextCallback(string text);
delegate void SetBytesCallback(int fichero, int ficheroNameLen, string nombre);
private void button1_Click(object sender, EventArgs e)
{
ParameterizedThreadStart conexion = new ParameterizedThreadStart(escuchar);
trabajo = new Thread(conexion);
trabajo.IsBackground = true;
trabajo.Start(textBox1.Text);
}
private void escuchar(object ip)
{
IPAddress ipServer = Dns.GetHostEntry((string)ip).AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipServer, 1050);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipEndPoint);
socket.Listen(100);
addText("Escuchando puerto...");
Socket conexion = socket.Accept();
addText("Conectado!!!");
bool conectado = true;
bool isFile = false;
BinaryWriter ArchivoBinario = null;
int fileNameLen = 0;
bool createFile = false;
string totalSizeFile = "";
string NombreFichero = "";
int recibeSizeFile = 0;
while (conectado)
{
if (!isFile)
{
byte[] bytesRecibe = new byte[1024];
int datosRecibe = conexion.Receive(bytesRecibe);
addText("Se recibieron " + datosRecibe.ToString() + " bytes");
string mensaje = System.Text.Encoding.ASCII.GetString(bytesRecibe, 0, datosRecibe);
string[] partes = mensaje.Split(':');
if ((string)partes[0] == "file")
{
addText("Se va a recibir un archivo de " + partes[1] + " bytes");
totalSizeFile = partes[1];
isFile = true;
}
else if (mensaje == "close")
{
conectado = false;
}
else
{
addText(mensaje);
}
}
else
{
byte[] TamanioDatos = new byte[2024 * 99999];
addText("Recibiendo archivo...");
int BytesRecibidosLen = conexion.Receive(TamanioDatos);
recibeSizeFile = recibeSizeFile + BytesRecibidosLen;
addText("Se recibieron " + BytesRecibidosLen.ToString() + " bytes");
if (!createFile)
{
fileNameLen = BitConverter.ToInt32(TamanioDatos, 0);
addText("fileNameLen: " + fileNameLen.ToString());
}
else
{
fileNameLen = 0;
}
if (NombreFichero == "")
{
NombreFichero = Encoding.ASCII.GetString(TamanioDatos, 4, fileNameLen);
addText("Obtenemos el nombre del archivo: " + NombreFichero);
}
string rutaArchivo = "D:/prueba/" + NombreFichero;
if (!createFile)
{
addText("Creando archivo en disco: " + rutaArchivo);
ArchivoBinario = new BinaryWriter(File.Open(rutaArchivo, FileMode.Append));
createFile = true;
}
addText("Guardando archivo");
ArchivoBinario.Write(TamanioDatos, 4 + fileNameLen, BytesRecibidosLen - 4 - fileNameLen);
if (recibeSizeFile.ToString() == totalSizeFile)
{
ArchivoBinario.Close();
addText("Archivo recibido y guardado");
addText("En total se recibio " + recibeSizeFile.ToString() + " bytes");
isFile = false;
createFile = false;
recibeSizeFile = 0;
NombreFichero = "";
}
}
}
addText("Cerrando la conexion");
conexion.Shutdown(SocketShutdown.Both);
socket.Close();
addText("Conexion cerrada");
}
private void addText(string texto)
{
if (textBox2.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(addText);
this.Invoke(d, new object[] { texto });
}
else
{
string datetime = DateTime.Now.ToString();
string[] partes = datetime.Split(' ');
string hora = partes[1] + " " + partes[2];
if (textBox2.Text == "")
{
textBox2.Text = hora + " " + texto;
}
else
{
textBox2.Text = hora + " " + texto + "\r\n" + textBox2.Text;
}
}
}
}
}