ouvrir et lire un fichier sur serveur

ouvrir et lire un fichier sur serveur - C++ - Programmation

Marsh Posté le 29-08-2007 à 11:07:33    

Salut,
 
Comment écrire un code client en C++ pour ouvrir et lire un fichier texte situé sur un serveur distant (sans rapatrier ce fichier)?
Quels sont les protocoles généralement utilisés et quelles sont les méthodes appropriées ?
 
Si quelqu'un avait un exemple simple pour me montrer comment faire en sorte que le fopen (de ifstream) du code client comprenne qu'il faut ouvrir un fichier sur serveur...
 
Merci,
 
Un vrai débutant

Reply

Marsh Posté le 29-08-2007 à 11:07:33   

Reply

Marsh Posté le 29-08-2007 à 11:13:19    

Tu passes par un montage NFS [:arcueid brunestud]

Reply

Marsh Posté le 29-08-2007 à 11:16:01    

Elmoricq a écrit :

Tu passes par un montage NFS [:arcueid brunestud]


 
Cela permet de n'avoir qu'une lettre pour identifier le serveur, c'est cela ?
Si oui, je suis ok, cela marche.
 
Mais précisément je cherche la solution sans montage...
 
Merci quand même
;-)

Reply

Marsh Posté le 29-08-2007 à 12:17:04    

ftp

Reply

Marsh Posté le 29-08-2007 à 13:00:58    

ftp ?  
C'est un peu court...Pour que je puisse comprendre...
Quelqu'un sait-il comment faire un code client en C++ pour OUVRIR (puis lire) un fichier texte distant ?
En utilisant ftp comme protocole pourquoi pas...??
 
Merci

Reply

Marsh Posté le 29-08-2007 à 13:16:09    

Reply

Marsh Posté le 29-08-2007 à 15:46:46    

coco441 a écrit :

ftp ?
C'est un peu court...Pour que je puisse comprendre...
Quelqu'un sait-il comment faire un code client en C++ pour OUVRIR (puis lire) un fichier texte distant ?
En utilisant ftp comme protocole pourquoi pas...??

 

Merci

 

Tu ne peux pas ouvrir directement un fichier sur un serveur distant, sauf si le système de fichiers est monté en local d'une manière ou d'une autre (par exemple à l'aide d'un montage NFS).
La seule solution vraiment viable est de récupérer le fichier et de le traiter en local. D'où la réponse de Taz : ftp.

 

Quant à savoir ce que c'est : Google [:ofou]


Message édité par Elmoricq le 29-08-2007 à 15:47:55
Reply

Marsh Posté le 29-08-2007 à 15:57:44    

NFS ou CIFS amha

 

Je vois pas non plus pourquoi il y aurait un problème avec ftp, à part rapatrier le fichier pour le lire (à la différence des deux premiers cités).

 

En revanche, si c'est pour coder un client from scratch, vaudrait mieux jouer avec des sockets et du ftp (et utiliser fdopen à la place de fopen) que de se lancer à fond les manettes dans les RPC, ca pourrait être long et douloureux :o

 

Edit: ah oui et probablement autre possibilité: webdav.

Message cité 1 fois
Message édité par Gf4x3443 le 29-08-2007 à 15:59:34
Reply

Marsh Posté le 30-08-2007 à 07:07:39    

Gf4x3443 a écrit :

NFS ou CIFS amha
 
Je vois pas non plus pourquoi il y aurait un problème avec ftp, à part rapatrier le fichier pour le lire (à la différence des deux premiers cités).
 
En revanche, si c'est pour coder un client from scratch, vaudrait mieux jouer avec des sockets et du ftp (et utiliser fdopen à la place de fopen) que de se lancer à fond les manettes dans les RPC, ca pourrait être long et douloureux :o
 
Edit: ah oui et probablement autre possibilité: webdav.


 
Précisément,
 
Je pense qu'il me faut utiliser des sockets (après avoir lu plusieurs choses sur le net...). Je ne savais par contre pas comment ouvrir le fichier distant...Je regarde la piste fdopen...Merci.
 
PS : dommage que je n'ai pu trouver un exemple (court) disponible sur le net...

Reply

Marsh Posté le 30-08-2007 à 07:19:54    

Un example sur le net? Sérieux c'est la base des socket, cherche mieux.

 

Fait à l'arrache, un truc dans le genre (minus les erreurs de syntaxe hein, pas taper :/ )

 

Socket TCP:

 
Code :
  1. int ret, fds;
  2.         FILE * stream;
  3.         struct addrinfo * res;
  4.         struct addrinfo hints;
  5.         memset(&hints, 0, sizeof(hints));
  6.         hints.ai_flags    = AI_PASSIVE;
  7.         hints.ai_family = AF_INET;
  8.         hints.ai_socktype = SOCK_STREAM;
  9.         hints.ai_protocol = IPPROTO_TCP;
  10.        /* Get connect info for host/port */
  11.         ret = getaddrinfo(host, port, &hints, &res);
  12.         if (ret != 0)
  13.                 errx(EX_DATAERR, "blabla" );
  14.         if ((fds = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)
  15.                 err(EX_OSERR, "blabla2" );
  16.         int optval = 1;
  17.         if (setsockopt(fds, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)))
  18.                 err(EX_OSERR, "blabla3" );
  19.         if (bind(fds, res->ai_addr, res->ai_addrlen) != 0)
  20.                err(EX_OSERR, "blabla4" );
  21.         freeaddrinfo(res);
  22.         if (listen(fds, 10) != 0)
  23.                 err(EX_OSERR, "blabla5" );
  24.         if ( fcntl(fds, F_SETFL, O_NONBLOCK) == -1 )
  25.                 err(EX_OSERR, "blabla6" );
  26.         stream = fdopen(fds, "rw" );
  27.         if (stream == NULL)
  28.                 err(EX_OSERR, "blabla7" );
  29.         /* fread/fwrite/fseek ... */


Message édité par Gf4x3443 le 30-08-2007 à 07:23:46
Reply

Marsh Posté le 30-08-2007 à 07:19:54   

Reply

Marsh Posté le 30-08-2007 à 08:22:50    

Merci mais j'avais effectivement déjà pu lire ce type de code, sauf que je ne comprends toujours pas comment on passe l'info concernant le nom du fichier à ouvrir (puis lire)...
Dans l'exmple, on construit la socket fds pour communiquer avec le serveur et on comprend qu'il y a ouverture d'un fichier grâce à fdopen...Mais quel fichier ?? fds pointe bien sur l'IP du serveur (getadrrinfo) mais où dit-on au client d'aller lire le fichier \users\toto.txt sur ce serveur ??
 
J'aurai envie d'écrire un truc du style stream=fopen("\users\toto.txt", "r" )...mais stream est déjà associé à la socket...
 
???

Reply

Marsh Posté le 30-08-2007 à 08:58:06    

Houla, je pense qu'on va (re)commencer par le commencement alors.
 
socket: http://www.laissus.fr/cours/node18.html
 
Tout ce qui est protocole (NFS, FTP, HTTP) sont plus haut niveau que TCP, lui même basé sur IP. Le socket ne concerne que TCP/IP, c'est à toi de faire le protocole pour ouvrir ton fichier distant. Soit tu le fais toi même (client + serveur à coder), soit tu te greffes par dessus un protcole existant, et il ne te reste plus que le client à modifier légèrement pour faire ce que tu veux.
 
Par exemple, pour ftp, tu ouvres le socket, tu récupères le fichier (get...) tu le mappes en mémoire (mmap) tu travailles dessus, et tu le renvoies au serveur (put).
 
Oui, y'a du code à taper...
 
Personnellement, j'obterais pour des partages réseau genre NFS/CIFS, ils ferront aussi bien, et tu travailles sur le fichier directement au travers du partage monté.
 
Question de choix.

Reply

Marsh Posté le 30-08-2007 à 09:50:45    

Sans faire de code côté serveur et sans montage type NFS, il faut récupérer(get...) le fichier avant de travailler dessus...Il est rapatrié côté client ?

Reply

Marsh Posté le 30-08-2007 à 09:52:55    

Oui. Encore une fois, tu ne peux pas ouvrir un fichier directement s'il se trouve sur un serveur distant, sauf s'il est monté d'une manière ou d'une autre de manière locale.
Si tu ne passes pas par un NFS quelconque, tu dois rapatrier le fichier.

Reply

Marsh Posté le 30-08-2007 à 09:56:40    

Sans faire de code côté serveur et sans montage type NFS,il faut donc avoir de l'espace disque disponible côté client...C'est nul !!

Reply

Marsh Posté le 30-08-2007 à 10:00:32    

Attends. Imagine maintenant le cas inverse : tu peux ouvrir tous les fichiers que tu veux directement sur le serveur que tu veux. Et pose-toi ensuite la question suivante : est-ce que ça te plairait de savoir, lorsque tu te connectes sur internet, que tout le monde potentiellement peut accéder à tes fichiers directement et les lire ou les modifier ?

 

edit : hmm, j'ai sans doute répondu à côté de la plaque [:elmoricq]


Message édité par Elmoricq le 30-08-2007 à 10:03:23
Reply

Marsh Posté le 30-08-2007 à 10:01:59    

coco441 a écrit :

Sans faire de code côté serveur et sans montage type NFS,il faut donc avoir de l'espace disque disponible côté client...C'est nul !!

 

Si tu avais lu ce que j'ai marqué au dessus, rien ne t'empeche de mapper une zone pour écrire dedans. Au lieu d'espace disque, c'est en ram que tu travailles.

 

man mmap.

 
Elmoricq a écrit :

Attends. Imagine maintenant le cas inverse : tu peux ouvrir tous les fichiers que tu veux directement sur le serveur que tu veux. Et pose-toi ensuite la question suivante : est-ce que ça te plairait de savoir, lorsque tu te connectes sur internet, que tout le monde potentiellement peut accéder à tes fichiers directement et les lire ou les modifier ?

 

Y'a pas que ca en plus: au niveau local, le noyau peut gérer les accès concurrentiels avec des verrous, qu'on peut mettre dans le code avec la libpthread ou des semaphores.

 

Par réseau, ca va être galère à gérer [:ddr555]


Message édité par Gf4x3443 le 30-08-2007 à 10:03:35
Reply

Marsh Posté le 30-08-2007 à 10:24:43    

HTTP aussi, dav, toussa.
 
On y peut quoi : l'informatique c'est pas magique.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed