elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Enviar archivo con sockets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Enviar archivo con sockets  (Leído 2,272 veces)
NowhereMan

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Enviar archivo con sockets
« en: 12 Enero 2016, 07:26 am »

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:
Código:
#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
Código:
#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;
}


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Enviar archivo con sockets
« Respuesta #1 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.


En línea

NowhereMan

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Enviar archivo con sockets
« Respuesta #2 en: 12 Enero 2016, 21:04 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
URGENTE!!! ENVIAR ARCHIVOS POR MEDIO DE SOCKETS EN JAVA
Java
SAHEKA_14 2 7,121 Último mensaje 16 Diciembre 2009, 00:47 am
por Blitzkrieg'
Enviar mensaje sockets
Programación C/C++
Stereo 0 2,291 Último mensaje 19 Noviembre 2011, 12:20 pm
por Stereo
PREGUNTA: COMO PUEDO ENVIAR ARCHIVOS GRANDES POR SOCKETS EN C++???
Programación C/C++
inGnio 7 7,764 Último mensaje 3 Agosto 2012, 13:43 pm
por fary
como enviar un correo desde c++ (sockets y winsocks)?? ...
Programación C/C++
fabian7593 5 4,629 Último mensaje 26 Septiembre 2013, 09:10 am
por eferion
Enviar caracteres ascii por sockets
.NET (C#, VB.NET, ASP)
boy-ka 3 4,523 Último mensaje 11 Abril 2015, 23:59 pm
por boy-ka
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines