Des precisions sur l'appli reseaux (mail de la semaine derniere) et
des questions supplementaires pour une appli similaire (avec ftp cette
fois).
Pre-Scriptum : la remarque envoyee pour uname est que dans un nieme
sous-reseaux, cette
commmande ne donne que le nom du sous-reseaux courant.
(ou alors je me trompe).
Pre-Scriptum 2: Le qualificatif "sale" pour ta solution (mail de Edgar
Bonet Orozco) n'est pas
pejoratif, simplement pour dire qu'on utilise une "bombe
atomique" pour un
petit renseignement (fin du probleme, c'est resolu pour
mon appli).
Precisions:
Je suis en train d'ecrire une appli en C (+ GTK1.2) sous Linux pour
faciliter le ftp (barbare en ligne de commande). En clair il s'agit
d'une interface GTK ou l'utilisateur entre les coord de la machine a
contacter puis il n'a plus qu'a cliquer sur des icones pour executer les
commandes ftp (listing, send, get ...). Seulement je ne m'attendais pas
a trouver une interface encore plus barbare avec ftpd (puisque je me
connecte sur le port 21).
Le probleme, donc, se pose pour executer la commande LIST par
exemple qui necessite une connection supplementaire (DATA connection).
Faut-il programmer un serveur sur la machine locale pour recevoir les
donnees du serveur ftp distant? Comment ensuite utiliser la commande
PORT (dont la syntaxe reste un mystere h1,h2,h3,h4,p1,p2)?
Enfin quand j'envoi au daemon ftp user LOGIN\n
pass PASSWD\n
il ne semble pas prendre en compte ces commandes (j'utilise des
sockets, et les commandes send et recv)
Voici la partie utile du code utilise (on laisse tomber la gestion
des erreurs):
int sends_connect()
{
LENGTH_SOCK=sizeof(struct sockaddr);
/* Socket opening */
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == -1){
raise_error_double XXX;
return(0);
}
/* Binding socket on a port */
hook = bind(fd, (struct sockaddr *)&my_addr, LENGTH_SOCK);
if (hook == -1){
close (fd);
raise_error_simple XXX;
return(0);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(REMOTE_PORT); /* set to 21 */
their_addr.sin_addr.s_addr=inet_addr(REMOTE_ADDR);
bzero(&(their_addr.sin_zero), 8);
/* Connection at least */
bridge=connect(_fd, (struct sockaddr *)&their_addr, LENGTH_SOCK);
if (bridge==-1){
close(fd);
raise_error_simple XXX
return(0);
}
/* Setting what remote machine expects */
bzero(DATA, BUF_LEN);
recv(fd, DATA, BUF_LEN, 0);
printf("je recois : %s", DATA); /* welcome message of remote ftpd */ |
OK celui-ci je l'ai.
sprintf(_mesg,"user %s\n", LOGIN); |
send(fd, _mesg, sizeof(_mesg), 0)); | C'est ici que la
procedure de LOGIN est
| effectuee mais le
ftpd distant
sprintf(_mesg,"pass %s\n", PASSWD); | ne semble pas obtenir
mes commandes
send(fd, _mesg, sizeof(_mesg), 0)); | pourquoi?
|
bzero(DATA, BUF_LEN);
recv(_current_socket.fd, DATA, sizeof(DATA), 0); -> ben rien du
coup.
printf("recu : %s", DATA);