• Viernes 8 de Noviembre de 2024, 20:00

Autor Tema:  Programacion De Sockets  (Leído 886 veces)

hackcolom

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Programacion De Sockets
« en: Lunes 15 de Octubre de 2007, 17:06 »
0
estoy desarrollando un programa que me permita listar directorios
y archivos remotos por consola D.O.S
 
el codigo que he escrito ,en el lado del sevidor ,realiza un recorrido del contenido del directorio donde se esta ejecutando el server

el problema es que cuando quiero enviar las cadenas de los nombres de los directorios
al cliente

a veces me llegan ,a veces no, o llegan como si estuvieran montadas unas en otras,
o llegan fracturadas

he probado limpiando el buffer de envio de la cadenas y tembien el buffer en el que recibo, en el lado del cliente

he probado de todo un poco no se que puedad estar pasando

aqui dejo el codigo fuente los estoy desarrollando en dev-c++
con winsock

codigo /*servidor*/


#include <stdio.h>
#include <winsock.h>
#include <windows.h>
#include <dirent.h>


#define PORT 3550
#define BACKLOG 12
#define MAXSIZE 1024


 void Iniciarred();
 void Terminarred();
 
      int s,b,l,sa;
      struct sockaddr_in my_addr;
      char buf[MAXSIZE];
      char rutaactual[256];
      DIR *directorio;
      struct dirent *fichero;
      char diractual[256];
      char *cadenv;
     
 
 
 
 void Iniciarred(){
     
 WSADATA info;
 
       if((WSAStartup(MAKEWORD(2,0),&info))!=0){
       printf("problema al iniciar winsock\n");
       exit(-1);                                        
       }    
     
}

char *limpiarcadena(char *cad){
     
     int i=0;
     
     for(i=strlen(cad); i>0 ;i--  ){
                       
               if( (cad!='\0') ){
                   
               cad[i+1]='\0';
               break;    
                   
               }                  
                       
     }
  return cad;  
     
}



void comandols(char *dirac){
     
     directorio=opendir(dirac);
     
     while( (fichero=readdir(directorio))!=NULL){
           
           // strcat(fichero->d_name,"\n");
           
            //fichero->d_name[strlen(fichero->d_name)]='\0';
           
            //cadenv=limpiarcadena(fichero->d_name);
           
           
           //fichero->d_name[fichero->d_namlen+1]='\0';
           
           
        send(sa,fichero->d_name,sizeof(fichero->d_name),0);
          //send(sa,cadenv,htonl(strlen(cadenv)+1),0);
       
            //printf("%s\n",cadenv);
           
            printf("%s\n",fichero->d_name);
            printf("%d\n",fichero->d_namlen);
           
            printf("\n");
           
            fichero->d_name[fichero->d_namlen+1]='\0';
           
     }
     
     
     
}





                     void Terminarred(){
                         
                     WSACleanup();    
                         
                     }




int main()
{
    Iniciarred();
   
              if( (s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1){
              printf("Error en socket()\n");
               exit(-1);    
              }


my_addr.sin_family     =AF_INET;
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
my_addr.sin_port       =htons(PORT);
memset( &(my_addr.sin_zero),'\0',sizeof(my_addr));    
   
   
   
   
                           if( (b=bind(s,(struct sockaddr *)&my_addr,sizeof(my_addr)))==-1){
                           printf("Error en bind()\n");
                           exit(-1);    
                           }
                           
                           
                           

if( (l=listen(s,BACKLOG))<0){
printf("Error en listen()\n");
exit(-1);    
}


                         if( (sa=accept(s,0,0))<0){
                         printf("Error en accept()\n");
                         exit(-1);
                         }


                       while(1){
                               
                       if( (recv(sa,buf,sizeof(buf),0))==-1){
                       printf("Error en recv()\n");
                       exit(-1);
                       }    
                       
                       
                       
                       if( (strcmp(buf,"ls"))==0 ){
                           
                      // printf("Comando ls\n");
                       
                       comandols(diractual);
                           
                       }
                       
                       
                       if( (strcmp(buf,"cd"))==0 ){
                           
                       printf("Comando cd\n");
                       
                        exit(-1);
                         
                       }
                       
                       
                         
                       if( (strcmp(buf,"put"))==0 ){
                           
                       printf("Comando put\n");
                       exit(-1);    
                       }
                       
                         
                       if( (strcmp(buf,"get"))==0 ){
                           
                       printf("Comando get\n");
                       exit(-1);    
                       }
                       
                       if( (strcmp(buf,"inicio"))==0){
                           
                        GetCurrentDirectory(256,rutaactual);
                        strcpy(diractual,rutaactual);
                        strcat(rutaactual,">");                        
                        send(sa,rutaactual,sizeof(rutaactual),0);
                       
                           
                           
                       }
                       
                       
                       
                       
                       
                       }
                   
                 


   

    Terminarred();

 return 0;
}





/*codigo cliente*/

#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>

#define PORT 3550
#define MAXSIZE 1024


void Iniciarred();
void Terminarred();

int s,c;
struct sockaddr_in my_addr;
struct hostent *he;
char buf[MAXSIZE];
char opt[256];
char optesc[256];
int estado;
char *cadenv;




char *limpiarcadena(char *cad){
     
     int i=0;
     
     for(i=strlen(cad); i>0 ;i--  ){
                       
               if( (cad!='\0') ){
                   
               cad[i+1]='\0';
               break;    
                   
               }                  
                       
     }
  return cad;  
     
}















                   void Iniciarred(){
                       
                   WSADATA info;
                   
                   
                             if( (WSAStartup(MAKEWORD(2,0),&info))!=0){
                             printf("Error en winsock()\n");
                              exit(-1);    
                             }    
                   }
                   
                   
                   
                   
                   
                   
                   
                   
void Terminarred(){

WSACleanup();    
     
     
}


int main(int argc ,char **argv  ){
   
    system("cls");
   
   Iniciarred();
   
                     if( (s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1){
                     printf("Error en socket()\n");
                     exit(-1);    
                     }
           
 he=gethostbyname(argv[1]);  
 
 
 my_addr.sin_family=AF_INET;
 memcpy( &(my_addr.sin_addr.s_addr),he->h_addr,he->h_length);  
 my_addr.sin_port=htons(PORT);    
 memset( &(my_addr.sin_zero),'\0',sizeof(my_addr));
           
                       
                      if( (c=connect(s,(struct sockaddr*)&my_addr,sizeof(my_addr)))==-1){
                      printf("Error en connect()\n");
                      exit(-1);    
                      }
           
               
               
               
                 
               send(s,"inicio",6,0);
                recv(s,buf,sizeof(buf),0);
               
                 printf("Conectado a:  %s\n\n",argv[1]);
                      printf("\n\n\n");
                     
                     
               
               
               while(1){
                       
                    printf("%s",buf);
                       scanf("%s",&opt);
                     
                      send(s,opt,sizeof(opt),0);
               
                           
                     
                    while(1){
                             
                              if( (recv(s,optesc,sizeof(optesc),0))<=0)break;
                             
                              cadenv=limpiarcadena(optesc);
                             
                             
                             
                              printf("%s\n",optesc);
                              printf("%d\n",strlen(optesc));
                              //printf("\n");
                               optesc[strlen(optesc)+1]='\0';
                               
                             
                             
                           

                           //delete(&optesc);
                             
                       
                         
                         
                     }
                     
             
                     
 }
               

               
               
                     
                     
   
   
    Terminarred();
   
   
return 0;    
}



por favoro alguien que me pueda decri porque esta sucediendo eso

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Programacion De Sockets
« Respuesta #1 en: Lunes 15 de Octubre de 2007, 18:59 »
0
Depuralo, asi a primera vista esto deberia estar mal:

¿sizeof(fichero->d_name)?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.