1
I have the following situation, I need to transfer an xml from one application to another via network (Socket) set up the methods of client and server which I will post just below, The file is transmitted smoothly, however files with more than 6kb are coming incomplete, I have been researching some methods on the network but so far none teaches me exactly how to ensure the integrity of the file, This is that the file was received completely. There is another problem in the method below this catching on While, Until I give the client.close does not leave, However I needed to send the return to the customer if I close the connection can not, Follow code:
Client:
try
{
//Grava o arquivo fisico
var savedFile = Auxiliares.SalvarArquivo(xml, vendaid, "xml");
//Pega o nome do arquivo
var nomeArquivo = savedFile[1];
//Valida o tamanho
var nomeArquivoByte = Encoding.UTF8.GetBytes(nomeArquivo);
if (nomeArquivoByte.Length > 5000 * 1024)
{
return "O tamanho do arquivo é maior que 5Mb, tente um arquivo menor.";
}
//Sepera os bytes e etc
var fileData = Auxiliares.ReadAllBytes(savedFile[2]);
var clientData = new byte[4 + nomeArquivoByte.Length + fileData.Length];
var nomeArquivoLen = BitConverter.GetBytes(nomeArquivoByte.Length);
//Copia para o stream
nomeArquivoLen.CopyTo(clientData, 0);
nomeArquivoByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + nomeArquivoByte.Length);
//Conecta
clientSock.Connect(ipEnd);
//Envia
clientSock.Send(clientData, 0, clientData.Length, 0);
//Recebe o retorno do servidor
clientSock.Receive(retornoServidorByte);
//Fecha conexao
clientSock.Close();
}
catch (SocketException soc)
{
return soc.Message;
}
Server:
//Aceita a conexao
using (Socket clientSock = sock.Accept())
{
WriteLog("Cliente: " + clientSock.RemoteEndPoint + " Conectado");
#region NEW
//Buffer
clientSock.ReceiveBufferSize = 16384;
//Tamanho buffer arquivo
var dadosCliente = new byte[1024 * 50000];
//Recebe os dados enviados do cliente
var tamanhoBytesRecebidos = clientSock.Receive(dadosCliente, dadosCliente.Length, 0);
//Tamanho arquivo
var tamnhoNomeArquivo = BitConverter.ToInt32(dadosCliente, 0);
//Nome Arquivo
var nomeArquivo = Encoding.UTF8.GetString(dadosCliente, 4, tamnhoNomeArquivo);
//Caminho para salvar o arquivo
var caminhoRecepcaoArquivos = Application.StartupPath + @"\tempfiles\";
if (!Directory.Exists(caminhoRecepcaoArquivos))
Directory.CreateDirectory(caminhoRecepcaoArquivos);
//Escreve os dados recebidos no arquivo
var bWrite = new BinaryWriter(File.Open(caminhoRecepcaoArquivos + nomeArquivo, FileMode.Append));
bWrite.Write(dadosCliente, 4 + tamnhoNomeArquivo, tamanhoBytesRecebidos - 4 - tamnhoNomeArquivo);
//Valida o Recebimento (AQUI TRAVA ENQUANTO NAO DER CLOSE NO CLIENTE)
while (tamanhoBytesRecebidos > 0)
{
tamanhoBytesRecebidos = clientSock.Receive(dadosCliente, dadosCliente.Length, 0);
if (tamanhoBytesRecebidos == 0)
{
bWrite.Close();
}
else
{
bWrite.Write(dadosCliente, 0, tamanhoBytesRecebidos);
}
}
bWrite.Close();
//Monta o arquivo em memoria
string xml = Encoding.UTF8.GetString(File.ReadAllBytes(caminhoRecepcaoArquivos + nomeArquivo)).Replace("\0", string.Empty);
//Pega o retorno do SAT e envia devolta ao cliente
byte[] arquivoRetorno = Encoding.UTF8.GetBytes(retorno);
//Aqui eu devolveria um RETORNO PARA O CLIENTE POREM
clientSock.Send(arquivoRetorno);
//Fecha a conexao
clientSock.Close();
}
You need a way to ensure that the file arrives complete and I need to return a message to the client informing the result of the processing that would be a XML, Summarizing the flow: Client sends xml to server > Server reads file and processes > Returns client response xml
gives a search on Minimal Lower Layer Protocol (MLLP) that defines the message start and end characters.
– Rovann Linhalis