Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
759 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Script pour envoi de fichier par socket

n°1498385
DrOctopus
Posté le 03-01-2007 à 17:52:55  profilanswer
 

Reprise du message précédent :
ok merci, donc c'est pas bon pour le uid.  
 
Tu as dit: "un indice qui s'incrémente à chaque "accept()""
Je ne vois pas comment réaliser le lien entre la connexion d'un client différent et l'indice dont tu m'a parlé au-dessus. Car si j'arrive à avoir un indice différent pour chaque client,je n'ai plus qu'a l'utiliser pour différencier les noms des fichiers recus (ex: fichier_recv &indice)
 
Forme de la structure:
-Père
accepte un client  
indice = n
-Fils  
accepte un client  
indice = n+1
 
En bref: quel structure C peut me permettre qu'a chaque fois qu'on appelle accept(),on incrémente l'indice ?
 
merci pour ton aide :)
 

mood
Publicité
Posté le 03-01-2007 à 17:52:55  profilanswer
 

n°1498433
Sve@r
Posté le 03-01-2007 à 20:16:14  profilanswer
 

DrOctopus a écrit :

En bref: quel structure C peut me permettre qu'a chaque fois qu'on appelle accept(),on incrémente l'indice ?


[:petrus75]- Euh... je peux téléphoner à un ami ???
- Volontiers - Qui appelez-vous ?
- Mon cousin Popol  
- Ok - Vous avez 30 secondes
- Allo Popol ? Dis-moi, quelle structure peut me permettre qu'a chaque fois qu'on appelle accept(), on incrémente l'indice ?
- Euh attend... c'est pas un "struct" ??? << tuuut... tuuut... tuuut >>
- Les 30 secondes sont écoulées - Alors ???
- T trop nul Popol !!! - Je peux demander l'avis du public
- Volontiers - Alors le public:
    - si vous pensez que la réponse est "enum", vous tapez "1"
    - si vous pensez que la réponse est "while()", vous tapez "2"
    - si vous pensez que la réponse est "struct" vous tapez "3"
    - si vous pensez que la réponse est "exit()" vous tapez "4"
............<< attente >> ..........................
- Stat: 12% pour "1", 27% pour "2", 5% pour "3" et 78% pour "4"
- Mais le résultat fait plus de 100% ???
- C'est normal - C'est un pgm fait par DrOctopus qui dialogue avec les boites à voter du public via un pgm client/serveur et qui calcule les pourcentages...
- Ah ok - Bon, malgré les votes je choisis le 2...
 
 
 
Bon, assez ri - Algo :
1) Création de la socket: socket() + bind()
2) Création de la file d'attente: listen()
3) Initialisation indice i=0
4) boucle d'attente du client
while ((sk_dialog=accept(...)) != -1)
{
.........// Le client est connecté... SHAZZAM !!!
.........i++   // Waouhhh... J'AI INCREMENTE L'INDICE POUR MON NOUVEAU CLIENT !!!
 
5) Au choix: fork() ou pas
- si fork => le fils dialogue avec le client via "sk_dialog" pendant que le père retourne en 4 - le fils connait la variable "i" et sa valeur actuelle !!!
- si pas fork => pas de fils => un seul processus qui dialogue via "sk_dialog" puis retourne en 4
 
Toi compris ???


Message édité par Sve@r le 03-01-2007 à 20:55:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1498442
DrOctopus
Posté le 03-01-2007 à 20:40:14  profilanswer
 

C'est tellement mieux d'apprendre en s'amusant lol
Oki je pense avoir compris le système, je vais le tester sur le champ...
merci bcp!

n°1498519
DrOctopus
Posté le 03-01-2007 à 23:35:38  profilanswer
 

1ere question:
si j'utilise fork(), quel syntaxe ?
Si j'utilise un fork, est-ce que je dois laisser tout le code de réception de fichier avant la duplucation de processus ET AUSSI copier coller ce meme code dans le case 0 du fork ?
 
Quand je parle du code de reception de fichier je parle de celui-ci:
http://rafb.net/p/rHbqGa85.html
 
A ce que j'ai compris ,
dans le père il y a le code contenant le listen(), le accept(), la création du fichier (fopen()) et enfin le recv()  
et dans le case 0 du fork il y a simplement le recv (ou le fork ne se charge pas de la création d'un fichier_recv différent du père?)
 
Autre question:
fork() ou pas?
Je doute de + en + de l'interêt du fork pour mon programme. En effet, si j'utilise simplement la structure que tu a dite au-dessus:
while ((sk_dialog=accept(...)) != -1)
{
.........
.........indice++
 
a chaque fois qu'on incrémente l'indice (donc pour chaque client connecté) , le serveur va créer un fichier différent nommé fichier_recvindice.txt
 
Quel intéret selon toi présente le fork ? :hello:

n°1498575
franceso
Posté le 04-01-2007 à 09:18:10  profilanswer
 

L'intérêt du fork, c'est que différents clients peuvent être servis en même temps par les différents processus fils. (il me semble que Sve@r te l'a déjà dit...)
 
Si tu choisis la méthode fork, c'est le père qui est en charge d'établir les connexions avec les clients (listen, accept). A chaque nouvelle connexion, un fils est créé pour s'occuper des communications avec la socket client fraichement créée (créer un fichier, recevoir les données, ...) Tu ferais bien de regrouper toutes ces actions dans une fonction (au moins), histoire d'éviter le gros pâté de code dans le "case 0" du switch (fork ()).


---------------
TriScale innov
n°1498591
Sve@r
Posté le 04-01-2007 à 10:06:33  profilanswer
 

DrOctopus a écrit :

1ere question:
si j'utilise fork(), quel syntaxe ?
Si j'utilise un fork, est-ce que je dois laisser tout le code de réception de fichier avant la duplucation de processus ET AUSSI copier coller ce meme code dans le case 0 du fork ?


Si tu laisses tout le code de réception avant la duplication, t'auras donc un code de réception dupliqué et le fichier sera reçu 2 fois...
Faudrait vraiment mais vraiment que tu lises les tuto qu'on te fournit (http://fr.lang.free.fr/cours/Processus_Csyst_v1.0.pdf). Et aussi que tu t'entraines à faire un petit truc tout simple avec un fork histoire de voir le principe.
 

DrOctopus a écrit :

A ce que j'ai compris ,
dans le père il y a le code contenant le listen(), le accept(), la création du fichier (fopen()) et enfin le recv()  
et dans le case 0 du fork il y a simplement le recv (ou le fork ne se charge pas de la création d'un fichier_recv différent du père?)


T'as un exemple COMPLET de dialogue AVEC fork ici http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
Le fils ne fait que les tâches qu'on attend de lui. Pour toi, ce sera donc le fopen(), le recv() et le fclose(). Le père ne faisant que ce qu'on attend de lui, à savoir le accept() et le fork()
 

DrOctopus a écrit :

Autre question:
fork() ou pas?
Je doute de + en + de l'interêt du fork pour mon programme. En effet, si j'utilise simplement la structure que tu a dite au-dessus:
while ((sk_dialog=accept(...)) != -1)
{
.........
.........indice++
 
a chaque fois qu'on incrémente l'indice (donc pour chaque client connecté) , le serveur va créer un fichier différent nommé fichier_recvindice.txt
 
Quel intéret selon toi présente le fork ?


Concrètement et globalement ? Aucun.
 
Essaye d'imaginer ça comme une file d'attente à la poste. Sans fork, il n'y a qu'un seul guichet ouvert. Les clients passent un par un et sont servis à leur tour. Mis à part le premier de la file, les autres ne font rien. Mais à la fin tous auront été servis.
On va dire que s'il y a 5 client, l'ensemble des 5 aura été servi en 5mn; le premier ayant eu fini au bout de 1mn, le 2° ayant du attendre que le premier soit servi pour être servi aura dû attendre 1mn du premier plus 1mn pour lui aura donc fini en 2mn etc etc et à la fin, le 5° a fini au bout de 5mn après être entré.
 
Avec fork, dès qu'un client entre, un guichet s'ouvre pour lui. Il est servi immédiatement. Bien entendu, le service est plus lent car il y a d'autres guichets ouverts et l'employé qui est derrière va de guichet en guichet et fait un peu à chacun.
On va dire que là aussi il y a 5 clients. Le premier client commence donc immédiatement mais son traitement est plus lent car l'employé (le processeur de ton ordinateur) va de suite sur le 2° puis le 3° puis le 4° puis le 5° puis revient au premier etc (mais ça se passe très vite donc aucun n'a l'impression d'attendre). Et au final, les 5 clients auront fini aussi en 5mn.
 
La différence c'est :
- sans fork il y a un privilégié pendant que les autres attendent. Et s'il entre plus de clients que ce que le listen() a prévu, les clients en trop sont refusés.
- avec fork, tous sont acceptés. Mais la vitesse avec laquelle chacun est servi dépend du nombre de clients. Mais comme le client ne voit pas les autres et qu'il n'a pas l'impression d'attendre il n'a pas de ressentiment
 
Comme le dit Francesco, tu pourrais regrouper l'ensemble des actions
- fopen()
- recv()
- fclose()
Dans une fonction bien à part que tu appelles dès le accept. Ensuite, c'est facile de rajouter un fork et de mettre cette fonction dans le case 0 du fils et tester les 2 versions. Mais si t'as qu'un seul client, tu ne verras aucune différence...


Message édité par Sve@r le 04-01-2007 à 10:08:04

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1498846
DrOctopus
Posté le 04-01-2007 à 14:18:10  profilanswer
 

oki ca marche merci beaucoup !
Bah pour l'instant je suis seulement en local sur 1 seul pc (j'attend de revenir de vacance pour pouvoir tester avec 2 pc sous linux). mais il me semble qu'a chaque fois que j'envoie le fichier,le serveur prend en compte un utilisateur différent.
Je m'explique:
mes 2 prgrammes sont sur le bureau: nommées send (pour le client) et recv (pour le serveur)
je lance serv (qui tourne tout le temps)
je lance send, le fichier est transmis,et le serveur accepte le client en temps que "localhost 2015" par exemple. Le programme send s'arrete, quand je le relance, le serveur accepte le client comme "localhost 3056".
 
Conclusion: a chaque nouvel envoi de fichier, le serveur voit un client différent (alors que les 2 programmes tournent sur la meme machine).
Donc je pense je peux tester le fork meme en local, mais avec de + gros fichier car pour copier 60ko ca va vite lol.

n°1498900
Sve@r
Posté le 04-01-2007 à 15:20:11  profilanswer
 

DrOctopus a écrit :

oki ca marche merci beaucoup !


YES !!!

DrOctopus a écrit :

Bah pour l'instant je suis seulement en local sur 1 seul pc (j'attend de revenir de vacance pour pouvoir tester avec 2 pc sous linux).


Linux est multitâches. Tu peux très bien ouvrir 3 fenêtres consoles
- sur la première tu lances le serveur et tu regardes son comportement
- sur les deux autres tu lances ton client et tu regardes leur comportement => t'auras bien 2 clients "distincts" pour ton serveur
Tu peux même t'arranger pour que chaque client soit synchronisé avec l'autre pour que les 2 démarrent en même temps d'une façon très simple
- tu crées un script shell qui attend qu'un certain fichier soit créé pour lancer le client
- tu lances ton script shell depuis 2 fenêtres consoles => les 2 shells attendent en boucle
- tu crées le fichier depuis une 3° fenêtre console => les 2 shells lancent chacun le client en même temps => chaque client attaquera le serveur en même temps
 

DrOctopus a écrit :

mais il me semble qu'a chaque fois que j'envoie le fichier,le serveur prend en compte un utilisateur différent.
Je m'explique:
mes 2 prgrammes sont sur le bureau: nommées send (pour le client) et recv (pour le serveur)
je lance serv (qui tourne tout le temps)
je lance send, le fichier est transmis,et le serveur accepte le client en temps que "localhost 2015" par exemple. Le programme send s'arrete, quand je le relance, le serveur accepte le client comme "localhost 3056".


D'où viennent ces valeurs 2015 et 3056 que t'affiches ??? De quelle variable ??? J'espère que t'affiches pas "sk_dialog"  parce que t'auras un n° différent à chaque fois...
 

DrOctopus a écrit :

Conclusion: a chaque nouvel envoi de fichier, le serveur voit un client différent (alors que les 2 programmes tournent sur la meme machine).


D'un point de vue "logique", chaque programme tourne sur "une" machine avec son propre environnement. Que chaque machine soit "la même", le programme n'en n'a pas conscience...
Surtout que tout ordinateur possède un "réseau interne" qui se comporte exactement comme un réseau externe. Donc tout programme "réseau" peut très bien fonctionner sur un seul ordinateur...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1498932
franceso
Posté le 04-01-2007 à 16:13:02  profilanswer
 

DrOctopus a écrit :

Donc je pense je peux tester le fork meme en local, mais avec de + gros fichier car pour copier 60ko ca va vite lol.

Plutôt que d'utiliser de gros fichiers (inutile de pomper des ressources pour rien), tu pourrais endormir les clients pendant quelques secondes juste après la connexion, avant de transférer le fichier. Comme ça tu peux sans problème créer plusieurs clients «concurrents». (je pense que c'est plus simple que la solution de Sve@r, mais par contre ça ne permet pas d'avoir des connexions simultanées)


---------------
TriScale innov
n°1499406
DrOctopus
Posté le 05-01-2007 à 16:06:05  profilanswer
 

Oki, et bien j'ai intégrer le fork au programme, ça marche sur le meme ordi, et je vais attendre quelques jours pour pouvoir tester sur 2 pc distant.
Un grand merci a vous ;)

mood
Publicité
Posté le 05-01-2007 à 16:06:05  profilanswer
 

n°1504594
DrOctopus
Posté le 18-01-2007 à 13:35:06  profilanswer
 

Bonjour, je remet a jour mon post car j'ai un problème pour envoyer le fichier depuis un client WINDOWS vers le serveur (qui lui reste en linux).
Le ping marche bien, la résolution d'hote aussi. Voici mon code client:

Code :
  1. #include <stdio.h>              /* E/S standard: gets, printf, etc.               */
  2. #include <string.h>             /* strlen etc. , memcpy                           */
  3. /* compatibilite */
  4. #ifdef WIN32
  5. #include <winsock2.h>
  6. #else
  7. #include <sys/types.h>          /* Divers designateurs de type                    */
  8. #include <sys/socket.h>         /* Sockets en general                             */
  9. #include <netinet/in.h>         /* Sockets du domaine Internet                    */
  10. #include <netdb.h>              /* hostent, gethostbyname, gethostbyaddr          */
  11. #include <arpa/inet.h>
  12. #include <unistd.h>
  13. #include <stdlib.h>
  14. #define closesocket(s) close(s)
  15. #endif
  16. /**************************************************************************/
  17. #define nomhoteserveur   "localhost"
  18. #define portserveur      11111
  19. struct sockaddr_in adrserveur;  /* Adresse du serveur                   */
  20. struct sockaddr_in adrclient;   /* Adresse du client                    */
  21. int s;                          /* Numero socket                        */
  22. char message[100];              /* Tampon Donnees niveau application    */
  23. struct hostent *h;
  24. /**************************************************************************/
  25. int main (void)
  26. {
  27. /******************** CREATION  DE LA  SOCKET *****************************/
  28.    if ((s = socket (AF_INET, SOCK_STREAM, 6)) == -1) /* 6 = numero protocole TCP */
  29.    {
  30.       printf (">>> %s\n\n", "Creation socket impossible" );
  31.       exit (1);
  32.    }
  33. ...


Pas besoin d'en mettre +, car quand je lance le programme client sur windows, il m'affiche "Creation socket impossible". Il doit donc surement avoir un problème de syntaxe ? Pourriez-vous m'aider SVP ? :hello:

n°1504669
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-01-2007 à 16:24:03  profilanswer
 

DrOctopus a écrit :

Pas besoin d'en mettre +, car quand je lance le programme client sur windows, il m'affiche "Creation socket impossible". Il doit donc surement avoir un problème de syntaxe ? Pourriez-vous m'aider SVP ? :hello:


http://www.developpez.net/forums/s [...] stcount=40


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1504691
DrOctopus
Posté le 18-01-2007 à 17:25:20  profilanswer
 

merci beaucoup, et désolé de ne pas avoir mieux cherché dans tes anciennes réponses :(
A ce que j'ai compris sur l'utilité de WSADATA, c'est d'initialiser les sockets sur windows?  
Maintenant la socket arrive à se connecter, mais le fichier que le serveur reçcoit pèse pas moins de 300mo !! lol
J'ai cherché sur la toile quelques aides, et j'ai modifié le MAKEWORD comme ceci:
 
#if defined (WIN32)
   WSADATA wsa_data;
   int err = WSAStartup (MAKEWORD (2, 0), &wsa_data);
 
 
Résultat: le fichier reçu est vide

n°1504692
DrOctopus
Posté le 18-01-2007 à 17:28:48  profilanswer
 

euh je revient sur ce que j'ai dit, en fait le fichier recu est toujours de taille conséquente :(

n°1504695
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-01-2007 à 17:34:20  profilanswer
 

DrOctopus a écrit :

euh je revient sur ce que j'ai dit, en fait le fichier recu est toujours de taille conséquente :(


J'ai rien compris. C'est quoi le code qui ne va pas ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1504747
DrOctopus
Posté le 18-01-2007 à 19:07:09  profilanswer
 

Je ne sais pas ,c'est bien ca le problème lol.
J'ai intégré le code que tu m'a donné  
http://www.developpez.net/forums/s [...] stcount=36
 
Maintenant ,la connexion socket marche, mais quand j'envoi un fichier texte de 3ko, et je me retrouve coté serveur avec un fichier reçu de 20mo ! :s
Mais ça c'est quand mon serveur et mon client sont sur la meme machine windows. Plus tard, j'aurai un serveur mais en linux pour des clients linux et windows.
Donc peut etre que le fichier sera envoyé correctement vers un serveur linux ... (celui que j'avais programmé il y a quelques semaines)

n°1504750
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-01-2007 à 19:12:02  profilanswer
 

DrOctopus a écrit :

Je ne sais pas ,c'est bien ca le problème lol.
J'ai intégré le code que tu m'a donné  
http://www.developpez.net/forums/s [...] stcount=36


Fait péter le code de celui qui émet le fichier, on est pas devins. Je ne crois que ce que je vois.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1504754
DrOctopus
Posté le 18-01-2007 à 19:21:21  profilanswer
 
n°1505207
DrOctopus
Posté le 19-01-2007 à 17:58:21  profilanswer
 

salut, j'ai testé le programme client sur un windows et le serveur sur linux .(pour ceux qui ne suivait pas, j'ai 2 programmes, un client qui envoi un fichier, et 1 serveur qui recoit ce fichier)
Ca marche pas mal, seulement, a l'arriver ,le fichier recu est en double exemplaire. Exemple ,j'envoi "plouf" et je recoit :
plouf  
 
plouf
 
Pourtant, sur un analyseur de trame, le fichier est bien envoyé une seule fois... Je pense que c'est donc un probleme au niveau du programme de reception.  
Le truc encore + bizarre, c'est qu' avec un client linux, le serveur reçoit bien le fichier comme il faut....
 
voici mes 2 programmes:
serveur: http://rafb.net/p/jvRUtI99.html
client: http://rafb.net/p/GMWi5e83.html

n°1917717
Criss16000
Criss
Posté le 24-08-2009 à 04:19:17  profilanswer
 

bonjour DrOctopus
j'ai lit bien tes etapes  
je sui interessé de ton code parsque je trouve cette forum acause d'une recherche google sur le meme sujé
je sui entrain de faire le meme truck que tu a realisé  
je te demandé de toi une petite aide  
si tu peu menvoyé ton code finale sur mon Email : mostayou@hotmail.com
je besoin de sa tré urgent dans le plutot possible
car je sui tes lien mais ne marche pas
 
parsque je veu un code dans le titre est " Realisation des clients et d'un serveur avec les socket"
 
 
j'attanderai ton repanse  
et je te remercie a l'avance  Criss :)  

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Script pour envoi de fichier par socketPERL : script appelé par 1 autre ne fonctionne pas alors que seul oui
Script pour gestion de cours par catégoriesModifier un fichier
[Resolu] Comment lire dans un fichier ligne par lignecomment tricher dans un FORM grace au PHP ??? envoi d'une valeur ?
Cherche script pour ftp 
Plus de sujets relatifs à : Script pour envoi de fichier par socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR