Enviado em 09/02/2014 - 14:18h
Olá pessoal, um tempo atras fiz um programa para troca de arquivos servidor->cliente, ele funcionava legal, agora fui tentar transmitir um arquivo .zip e um .exe, mas ele só transmite uma parte, no arquivo .exe ele transimitiu apenas 400 bytes e parou e no .zip ele transmitiu 16kb e trava, então aumentei o fluxo de bytes para 4000, então ele foi até 200kb e travou, aumentei para 40k e só foi até 100kb, já até tentei colocar um delay de 1000ms no servidor para não sobrecarregar o buffer do cliente(não sei muito bem como funcionam as coisas nesse nivel), mas a dúvida é essa: porque essa atitude diferente com dados binários? no final das contas não são só bytes(bits)? tipo ctrl+c e ctrl+v? tá legal, agora ta na hora do código:
#include <string>
#include <stdio.h>
#include <socket.hpp>
#include <windows.h>
using namespace SOCKETS_P;
const std::string arquivo("tinyxml2.h");
int main()
{
uint32_t size;
int read;
char buff[40000];
FILE* file;
TCPServer server;
TCPClient* client;
file = fopen(arquivo.c_str(), "rb");
if(!file)
{
perror("fopen");
return 0;
}
fseek(file, 0,SEEK_END);
size = ftell(file);
rewind(file);
std::cout<<"Tamanho do arquivo(bytes): "<<size<<std::endl;
try
{
Socket::initWinApiSock();
server.setMaxConnections(5);
server.start(5050);
std::cout<<"Aguardando conexao..."<<std::endl;
while(!server.canRead())
Sleep(1000);
server.acceptConnection();
client = server.getLastClient();
std::cout<<"Enviando arquivo..."<<std::endl;
//envia o tamanho do arquivo
client->sendMessage(&size, sizeof(uint32_t));
while(!feof(file))
{
read = fread(buff, sizeof(char), 40000, file);
client->sendMessage(buff, read);
}
std::cout<<"Arquivo enviado."<<std::endl;
//Aguarda fim da conexão pelo cliente.
client->readMessage(buff, 1);
Socket::shutDownWinApiSock();
}
catch(Exception ex)
{
if(ex.getErrorId() == END_CONNECTION)
std::cout<<"Conexão encerrada."<<std::endl;
else
std::cout<<"Error: "<<ex.getErrorCause()<<std::endl;
}
fclose(file);
return 0;
}
#include <string>
#include <stdio.h>
#include <socket.hpp>
#include <windows.h>
using namespace SOCKETS_P;
const std::string arquivo("tinyxml2.h");
int main(int argc, char* argv[])
{
InternetAddress addr(AF_INET, "127.0.0.1", 5050);
uint32_t downloaded = 0, size = 0;
std::string read;
FILE* file;
TCPClient client;
if(argc > 1)
addr.setHost(argv[1]);
file = fopen(arquivo.c_str(), "wb");
if(!file)
{
perror("fopen");
return 0;
}
try
{
Socket::initWinApiSock();
client.connectTo(addr);
std::cout<<"Conectado ao servidor("<<addr.getIp()<<")."<<std::endl;
std::cout<<"Aguardando arquivo!"<<std::endl;
//O loop fica disposto desta maneira para caso o servidor falhe e atrase no envio de mensagens, o cliente continue esperando pelos dados
//!obs: usar contador para time_out.
while(!client.canRead())
{
Sleep(1000);
while(client.canRead())
{
if(!size)
{
client.readMessage(&size, sizeof(uint32_t));
std::cout<<"Tamanho do arquivo(bytes): "<<size<<std::endl;
}
else
{
downloaded += client.readMessage(read, 40000);
fwrite(read.c_str(), read.size()*sizeof(char), 1, file);
}
}
if(downloaded == size)
break;
}
std::cout<<"Arquivo baixado!"<<std::endl;
Socket::shutDownWinApiSock();
}
catch(Exception ex)
{
std::cout<<"Error: "<<strerror(ex.getErrorId())<<std::endl;
}
fclose(file);
return 0;
}
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Mint começou a apresentar varios erros (3)