Enviar archivo con sockets

Iniciado por NowhereMan, 12 Enero 2016, 07:26 AM

0 Miembros y 1 Visitante están viendo este tema.

NowhereMan

Que tal a todos, he estado trabajando en un programa que me envie un archivo via socket usando la libreria de windows. Lo intente abriendo un archivo (En mi caso una imagen jpg) en modo binario y guardandola en un buffer para enviar, el archivo logro enviarse, tiene el mismo peso que la original pero solo se media imagen, a veces solo una tercera parte, alguien me puede ayudar o decirme en que me equivoque? Gracias.

Codigo del programa que envia la imagen:

#include <iostream>
#include <winsock.h>
#include <fstream>
using namespace std;

int main(){
int iResult;
struct sockaddr_in server;
struct sockaddr_in client;
struct hostent *hp;
WSADATA wsaData;
SOCKET servidor;
SOCKET cliente;

ifstream input("ejemplo.jpg", ifstream::binary);
input.seekg(0, input.end);
long size = input.tellg();
input.seekg(0);

char * buffer = new char[size];
char tamanio[512];
itoa(size, tamanio, 10);

input.read(buffer, size);

cout << "\n\t\t ----- Servidor FTP by Abraham -----" << endl;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(iResult){
cout << "Error al iniciar." << endl;
return -1;
}

hp = (struct hostent *)gethostbyname("localhost");
if(!hp){
cout << "No se puede conectar al servidor." << endl;
return -1;
}

servidor = socket(AF_INET, SOCK_STREAM, 0);
if(servidor == INVALID_SOCKET){
cout << "No se puede crear socket." << endl;
WSACleanup();
return -1;
}

memset(&server, 0, sizeof(servidor));
memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(6000);

if(bind(servidor, (struct sockaddr*)&server, sizeof(server))==SOCKET_ERROR){
cout << "Error al asociar socket." << endl;
WSACleanup();
return -1;
}

if(listen(servidor, 0)==SOCKET_ERROR){
cout << "Error al escuchar." << endl;
WSACleanup();
return -1;
}

cout << "Esperando al cliente." << endl;
int size1 = sizeof(struct sockaddr);
cliente = accept(servidor, (struct sockaddr *)&client, &size1);
if(cliente == 0){
cout << "Error al aceptar." << endl;
WSACleanup();
return -1;
}

send(cliente, tamanio, sizeof(tamanio), 0);
Sleep(1000);
send(cliente, buffer, size, 0);
cout << "Enviados: " << size << " bytes." << endl;

closesocket(servidor);
input.close();
WSACleanup();
return 0;
}


Codigo del programa que recibe la imagen

#include <iostream>
#include <winsock.h>
#include <fstream>
using namespace std;

int main(){
int iResult;
struct sockaddr_in client;
struct hostent *hp;
WSADATA wsaData;
SOCKET cliente;
char buffer[512];

ofstream output("salida.jpg", ofstream::binary);

cout << "Recibir imagen" << endl;

iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(iResult){
cout << "Error al iniciar." << endl;
return -1;
}

hp=(struct hostent*)gethostbyname("localhost");
if(!hp){
cout << "No se puede conectar con servidor." << endl;
return -1;
}

cliente = socket(AF_INET, SOCK_STREAM, 0);
if(cliente == INVALID_SOCKET){
cout << "No se puede crear socket." << endl;
return -1;
}

memset(&client, 0, sizeof(client));
memcpy(&client.sin_addr, hp->h_addr, hp->h_length);
client.sin_family = hp->h_addrtype;
client.sin_port = htons(6000);

if(connect(cliente, (struct sockaddr *)&client, sizeof(client))==SOCKET_ERROR){
cout << "Error al conectar" << endl;
WSACleanup();
return -1;
}

cout << "Recibiendo datos... " << endl;

recv(cliente, buffer, sizeof(buffer), 0);

long int li;
li = atol(buffer);
char *buffer2 = new char[li];

Sleep(1000);
recv(cliente, buffer2, li, 0);

output.write(buffer2, li);
delete[] buffer2;

cout << "Listo!" << endl;

closesocket(cliente);
output.close();
WSACleanup();

return 0;
}

ivancea96

La prueba me ha funcionadocorrectamente. No me fijé en todo el código,pero lo ideal es que vieras, ya que tienen el mismo tamaño, qué parte del archivo está corrupta. Más que nada, ver si es una parte grande, o pequeña. Tal vez el archivos ea más grande que tu buffer, o cualquier otro problema.

NowhereMan

Cita de: ivancea96 en 12 Enero 2016, 14:41 PM
La prueba me ha funcionadocorrectamente. No me fijé en todo el código,pero lo ideal es que vieras, ya que tienen el mismo tamaño, qué parte del archivo está corrupta. Más que nada, ver si es una parte grande, o pequeña. Tal vez el archivos ea más grande que tu buffer, o cualquier otro problema.


El buffer que use para almacenar archivo recibido y el tamaño del archivo original son exactamente iguales, y ya cheque las propiedades de la nueva imagen y por lo visto concuerdan, pero no se porque el archivo no me llega bien.