Domingo 15 de Diciembre de 2024, 08:53
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Programacion De Sockets
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Programacion De Sockets (Leído 901 veces)
hackcolom
Nuevo Miembro
Mensajes: 1
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
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
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.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Programacion De Sockets