elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
07 Septiembre 2008, 02:52  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  Duda Con Sockets ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Duda Con Sockets ?  (Leído 137 veces)
kernel19

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Duda Con Sockets ?
« en: 06 Mayo 2008, 02:17 »

Bueno he estado estudiando sobre sockets en C con algunos de los links que UD´s han posteado en el foro y me nace una duda muchos son de crear servidor y cliente y eso lo entiendo, pero cuando llegan a la parte de enviar algo al servidor siempre envian una cadena de texto, mi duda esta en :  Si yo quiero mandar por ejemplo un archivo .txt o una imagen .jpg o un programa .exe o un archivo .rar que debo hacer ??
como lo envio

muchas gracias a sus respuestas.............. ;D
En línea
Flakito81

Desconectado Desconectado

Mensajes: 320



Ver Perfil
Re: Duda Con Sockets ?
« Respuesta #1 en: 06 Mayo 2008, 04:00 »

Pues de igual manera.

haces un lstat para que sepas del archivo que se trata y puedas darle una extensión, el tamaño, ...

El que envia:

1- abre el fichero y lee un bloque de bytes
2- lo envia por el socket
3- puedes indicar cual es el ultimo pakete con un campo extra en una estructura. Que será cuando encontremos final de fichero


El que recibe:
1- abre un fichero en modo escritura
2- lee del socket mientras le sigan llegando paketes y los escribe en el fichero abierto
3- ya está todo. :)

Un sencillo ejemplo:
Código
void recibe_file(FILE * fd, int sock) { 
  PACKET *packet;  // puntero a la estructura del protocolo del paquete
  int i;            // contador de caracteres
  packet = (PACKET *) malloc (sizeof(*packet)); //inicializamos el puntero
printf("Recibiendo archivo\n");
  do
  {  
    lee_paquete(packet, sock); //esto es recv
    /* Ordenamos los bytes de red a orden de bytes de host  */
    if (ntohl(packet->control) != DATOS)
       ERROR("TIPO DE PAQUETE INESPERADO\n");
    for (i=0;i < ntohl(packet->size); i++)
       putc (packet->data[i], fd);
  } while (!ntohl(packet->last));
printf("Archivo recibido\n");
} // fin funcion
 

Para enviar:

Código
void carga_paquete(FILE *fd,PACKET *packet){
int i=0; // contador de bytes
char c; //variable donde se almacena el caracter leido
while(i<SIZE){ // mientras no se llege al limite de bytes de datos ...
c=getc(fd); // leemos del fichero un caracter
if(feof(fd)) break; //si llegamos al final del fichero salimos del bucle
packet->data[i++]=c; //guardamos los bytes leidos en el campo data
}//fin while
packet->size=htonl(i); //convertimos el numero de bytes que enviaremos a formato red
if (feof(fd))
   packet->last=htonl(1); //convertimos la ordenacion de bytes del host a la de red
 else
   packet->last=htonl(0);
 packet->control = htonl(DATOS);
}
void check(PACKET* packet){
 char* ptr = (char*) packet; // localizamos secuencia de 32 bits en el paquete
 int i;
 int sum=0;
 packet->check=0;
 for (i=0; i<sizeof(*packet)-4;i++)
   sum += *ptr++; //acumulamos el numero de bits
 packet->check = htonl(sum); // ordenamos los bits para enviarlos por la red
} //fin check
void envia_archivo(int sc, char *archivo){
FILE *df;
PACKET *packet;
int cont=0,vivo=1;;
packet = (PACKET *) malloc (sizeof *packet); //inicializamos el puntero
df=openfile(archivo); //abrimos el archivo que nos piden
printf("Se está procediendo a enviar el archivo %s\n",archivo);
do{
carga_paquete(df,packet); // cargamos la informacion sobre el archivo
packet->secuencia = htonl(cont++); // numero de paquete
check(packet); // hacemos la suma de comprobacion
envia_paquete(sc,packet); //es un send
}while(!df && vivo); // lo hacemos mientras existan bytes que leer y recibamos el ping
free(packet); // liberamos la memoria
} // fin envia_archivo
 
 

La estructura puede ser algo asi, aunque esto es muy variable:
Código
typedef struct
{
 tipopakete  control;         // tipo de pakete
 int         secuencia;        // secuencuencia de pakete
 int         size;        // catidad de datos ( en bytes)
 int         last;            // indicador del ultimo pakete
 char      data[SIZE];  // datos
 int         check;        // detecta los errores(checksum)
} PACKET;
 
 

Saludos

PD: Solo es una referencia, es parte del codigo de un pekeño ftp que tuve que hacer años atrás cuando mis conocimientos eran menores.
En línea
kernel19

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Duda Con Sockets ?
« Respuesta #2 en: 06 Mayo 2008, 06:33 »

viejo muchas gracias esta muy buena la informacion, algunas cosas se me quedan pero estudiando las saco. ;D
En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC