
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;
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Instalação do cosmic no archlinux (0)
Formas seguras de instalar Debian Sid [RESOLVIDO] (14)









