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[i]!='\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[i]!='\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 favor alguien que me pueda decir porque esta sucediendo eso