patoloco
Registrado: 16 Feb 2006 Mensajes: 15
| Publicado: 31/05/2006 5:13 am | | | Título: Problema en Sockets |
| Buenas, estoy intentando hacer un programa cliente TCP que conecte al puerto 21(ftp), se logee y luego se pueda enviar los comandos al server. Funciona correctamente, logea y el server acepta el primer comando, ahora bien, cuando escribo el segundo comando, ya el server no responde a ese comando.
el programa es el siguiente:
| Cita: | #include <netinet/in.h> #include <signal.h> #include <netdb.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <resolv.h> #include <unistd.h> #include <errno.h>
int errno; char suser[100]; char spass[100]; int bytes; char cmd[512],scmd[520]; char buffer[1024],user[10],pass[32]; char httpquery[50]="GET /host HTTP/1.0";
main(int argc, char *argv[]) { system("clear"); printf("\n\t\t TCP client C0ded By 0ptiK\n\n"); if(argc<3) { printf("\n\n\t uso: %s <host> <port> \n",argv[0]); return(0); }
struct hostent *ht; struct sockaddr_in server; char *host = argv[1]; int port = atoi(argv[2]);
int sd; // nuestro socket
printf("\n[+] Host: %s \n[+] Port: %d \n",host,port);
if((ht=gethostbyname(argv[1])) == NULL) { printf("\n[+] Imposible resolver la IP del host.\n "); abort(); } if(ht) { printf("[+] Ip: %s\n",inet_ntoa(*((struct in_addr *)ht->h_addr)));; } if((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1) printf("\n [+] Error al abrir el socket. ");
bzero(&server, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = ((struct in_addr*)(ht->h_addr))->s_addr;
int co;
if ((co=connect(sd,(struct sockaddr *)&server, sizeof(server))) == -1) //Conectamos... { printf("\nError: %d", errno); printf("\n [+] Conexion rechazada.\n "); abort(); } else
printf(" \n conectado! \n\n");
printf("[+] Introduce usuario: "); scanf("%s",&user); fflush(stdin); printf("[+] Introduce passwd: "); scanf("%s",&pass); sprintf(suser,"user %s\r\n",user); sprintf(spass,"pass %s\r\n",pass);
send(sd,suser,strlen(suser),0); send(sd,spass,strlen(spass),0); sleep(1);
while (co != -1) {
bytes = recv(sd, buffer, sizeof(buffer), 0);
if(bytes == -1) { printf("\n [+] Error a la hora de recibir datos. "); abort(); }
buffer[bytes] = '\0'; printf("\n%s",buffer);
scanf("%s",&cmd); sprintf(scmd,"%s\r\n",cmd); send(sd,scmd,strlen(scmd)+1,0); sleep(1);
}
//Cerramos Socket if(close(sd)==0) printf("\n [+] Socket cerrado con exito. \n ");
}
|
|
|
pardu
Registrado: 03 Ago 2006 Mensajes: 11
| Publicado: 04/08/2006 12:33 pm | | | Título: |
| Hola,
La verdad es que yo hice un proyecto similar hace un tiempo pero siendo como soy corto de memoria no recuerdo los detalles del protocolo. Mi primera observación sería que dentro del while se encuentra un recv de 1024 bytes (char), lo cual me genera mis dudas, siempre se reciben 1024 bytes en el protocolo?posiblemente podría estar sucediendo que el servidor te envia menos bytes una vez que ingreses el comando, y cuando entra a la segunda vuelta del while se quede trabado en el recv. Espero que respondas ya que no tengo muchas ganas de reveer el RFC del FTP para ver los detalles del protocolo.
Pardu. |
|