IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Récupération des données dans un serveur et les envoyer dans un réseau local en UDP


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    Bonjour tous le monde,
    Je voudrais devlloper une application qui me permet de recuperet des données entrantes dans un buffer et envoyer le tous sur un réseau local merci de me donner des idées sur l'architecture à suivre ou bien un lien qui explique cette architecture merci

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 56
    Points
    56

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Recuperation des donées dans un serveur et les envoyes dans un réseau local en UDP
    Merci pour le tuto ùais j'ai toujour un probleme, la fonction qui me prmet de lire dans le buffer parceque dans le tuto c pas bien expliquer merci

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    la commande recvfrom permet de récupérer un packet.

    Un très bon tutoriel est disponible : http://broux.developpez.com/articles/c/sockets/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Recuperation des donées dans un serveur et les envoyes dans
    merci cette fonction nous permet uniquement de recevoir des données, mais pour les envoyés je n'ai pas trouvé de fonction

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    La réponse est dans le même tutoriel, au paragraphe précédent.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    Ok je vais voir, et je te tien au courant merci

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);


    int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen);


    peux tu m'expliqué le fonctionnement de ces deux fonctions afin que je me debloque et que je puisse avancé
    Merci

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);


    int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen);


    peux tu m'expliqué le fonctionnement de ces deux fonctions afin que je me debloque et que je puisse avancé
    Pour ça, il faut quelques notions sur le protocoles et les sockets. C'est pour ça qu'on t'a conseillé des tutoriels à lire de A-Z... La plupart des réponses à tes questions s'y trouvent.

    en gros, un sendto(), c'est une combinaison de connect() et de send()....

    Quand tu auras compris la différence entre mode connecté (TCP) et mode datagramme (UDP) ce sera beaucoup plus clair.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    Oui j'ai bien lu le tuto que vous m'avez conseillé et j'ai bien compris la differnece entre les protocoles UDP et TCP pour le moment j'avance un peux normalement je devrais le finir aujourd'hui j'espere bien mais juste une derniere question normalement si on utilise UDP comme protocole de transport on devrais pas utiliser la fonction recv (non connecté) mais j'ai vu quelques exmple qui le font je comprend pas pourquoi

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    juste une derniere question normalement si on utilise UDP comme protocole de transport on devrais pas utiliser la fonction recv (non connecté) mais j'ai vu quelques exmple qui le font je comprend pas pourquoi
    Moi non plus. Tu as vu ça où ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    http://broux.developpez.com/articles/c/sockets/
    Voila dans ce tuto il ya un exemple (utilisation d'un serveur UDP) je voix qu'il utilise bien la fonction recv()

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    memset(buffer, 0, sizeof(buffer)); //on nettoi le buf
    	if (buffer != NULL)
    	{
    	printf("buffer ok", buffer);
    	}
    		fichier = fopen ("out.ts", "r");
    		if (fichier != NULL)
    		{
    		fgets(chaine, *buffer, fichier);
     
    		fclose(fichier);
    }
    je voudrais juste savoir comment utiliser la fonction sendto en (UDP) parceque j'arrete pas de lire des tuto est des exemple mais ils explique simplement comment envoyé un caractere dans mon cas c'est un fichier que je veux envoyé en local merci

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    http://broux.developpez.com/articles/c/sockets/
    Voila dans ce tuto il ya un exemple (utilisation d'un serveur UDP) je voix qu'il utilise bien la fonction recv()
    Je ne vois pas de quoi tu parles. Les 2 fonctions de transfert de données du serveur UDP sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    static int read_client(SOCKET sock, SOCKADDR_IN *sin, char *buffer)
    {
       int n = 0;
       size_t sinsize = sizeof *sin;
     
       if((n = recvfrom(sock, buffer, BUF_SIZE - 1, 0, (SOCKADDR *) sin, &sinsize)) < 0)
       {
          perror("recvfrom()");
          exit(errno);
       }
     
       buffer[n] = 0;
     
       return n;
    }
     
    static void write_client(SOCKET sock, SOCKADDR_IN *sin, const char *buffer)
    {
       if(sendto(sock, buffer, strlen(buffer), 0, (SOCKADDR *) sin, sizeof *sin) < 0)
       {
          perror("send()");
          exit(errno);
       }
    }
    et elles me paraissent clairement orientées 'datagram'...

    Donne plus de précision (N° du paragraphe, titre...)

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    je voudrais juste savoir comment utiliser la fonction sendto en (UDP)
    http://emmanuel-delahaye.developpez....udp/cli/main.c
    http://emmanuel-delahaye.developpez....udp/srv/main.c

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je ne vois pas de quoi tu parles. Les 2 fonctions de transfert de données du serveur UDP sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    static int read_client(SOCKET sock, SOCKADDR_IN *sin, char *buffer)
    {
       int n = 0;
       size_t sinsize = sizeof *sin;
     
       if((n = recvfrom(sock, buffer, BUF_SIZE - 1, 0, (SOCKADDR *) sin, &sinsize)) < 0)
       {
          perror("recvfrom()");
          exit(errno);
       }
     
       buffer[n] = 0;
    0
       return n;
    }
     
    static void write_client(SOCKET sock, SOCKADDR_IN *sin, const char *buffer)
    {
       if(sendto(sock, buffer, strlen(buffer), 0, (SOCKADDR *) sin, sizeof *sin) < 0)
       {
          perror("send()");
          exit(errno);
       }
    }
    et elles me paraissent clairement orientées 'datagram'...

    Donne plus de précision (N° du paragraphe, titre...)




    if((n = recvfrom(sock, buffer, BUF_SIZE - 1, 0, (SOCKADDR *) sin, &sinsize)) < 0)
    cette fonction normalement elle est utilsé pour recevoir des informations sur le client (ip, port )alors que on UDP a ma connaissance le serveur envoi directement sans avoir d'information sur le client (non orienté=>) sinon c moi qui a mal compri est peut etre c la cause de mon blocage peux tu me donner plus d'information sur ce programme merci

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    if((n = recvfrom(sock, buffer, BUF_SIZE - 1, 0, (SOCKADDR *) sin, &sinsize)) < 0)
    cette fonction normalement elle est utilsé pour recevoir des informations sur le client (ip, port )
    client ou serveur, peu importe.
    alors que on UDP a ma connaissance le serveur envoi directement sans avoir d'information sur le client (non orienté=>) sinon c moi qui a mal compri est peut etre c la cause de mon blocage peux tu me donner plus d'information sur ce programme merci
    Par contre, en UDP, le serveur ne peut pas émettre spontanément vers un client qu'il ne connais pas. Il ne peut que répondre à une réception précédente au cours de laquelle les informations du client ont été renseignées et stockée dans un sin (SOCKADDR_IN)

    Dans ce code : la donnée 'si_client'

    Tu as lu les exemples que j'ai donné ou je perds mon temps à poster des liens ?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    Bonjour,
    Merci pour les liens que tu ma donner j'ai pratique ment tous lu je vais te donnée le code que je vien de finir. normalement il se compile sans probléme. mais mon probleme actuellement c que le ficheir je voudrais le lire sur l'adresse local 127.0.0.1, mais l'application qui devra recevoir les donées sur cette adresse ne reçoit rien je ne sais pas pourquoi..........................
    et merci pour tous
    voila le code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define port 1234
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
    #define port 1234
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main (void){
    FILE* fichier;
    int len = 1024;
    char buffer[len];
    SOCKET sock;
    int sock_err;
     
    /*Creation de la  socket*/
     
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == INVALID_SOCKET)
    {
       printf("socket()");
    exit(1);
    }
     
    /*création de'l'interface*/   
    SOCKADDR_IN sin ;//Initialisation
    //ZeroMemory(&sin, sizeof(sin));
     
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
     
    sin.sin_family = AF_INET;
     
    sin.sin_port = htons(port);
     
    if(sock_err = (bind (sock, (SOCKADDR *) &sin, sizeof sin) == SOCKET_ERROR))
        {
    		printf("erreur lors de l'initialisation de la socket\n");
    		exit(1) ;// ce n'est pa la peine d'aller loin
    		}
        memset(buffer, 0, len /*sizeof(buffer)*/); //Initialisation du buffer
        if (buffer != NULL)
        {
        	printf("buffer ok\n");
     
        }
        else {
        			printf("buffer NULL\n");
        			exit(0);
        			}
            /*ouvrire le fichier out.ts*/
            fichier = fopen ("out.ts", "rb"); //rb = lecture en mode byte
            if (fichier == NULL)
    	{
    	printf("erreur lors de l'ouverture du fichier out.ts\n");
            exit(1);
            }
     
            while (!feof(fichier)){
     
           	fread(buffer,1,len,fichier);
            /* envoi d'un fragment du fichier pas tout le fichier*/   
           /* le fichier n'est envoyé en intégrité qu'à la fin de la boucle*/
            sock_err =  sendto(sock, buffer, strlen(buffer), 0,(struct sockaddr *) &sin, sizeof(sin));
             memset(buffer, 0, len );
     
            }               
            fclose(fichier);
     
             printf ("Fermeture de la socket...\n" );
     
                 sock_err = closesocket(sock);
     
                          printf ("Fermeture du serveur terminee\n" );
        }

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par roujiC Voir le message
    mon probleme actuellement c que le ficheir je voudrais le lire sur l'adresse local 127.0.0.1, mais l'application qui devra recevoir les donées sur cette adresse ne reçoit rien je ne sais pas
    Tu es sous quel système ?
    Si c'est censé être un client, pourquoi un bind() ?

    En mode binaire, on ne peut pas utiliser strlen() (n'a de sens qu'en mode texte). Il faut utiliser la valeur retournée par fread().

    C'est d'ailleurs cette valeur qui sert de détection de fin de lecture et non feof() comme tu sembles me croire à tord. Pour faire une application réseau, une maitrise des bases du C est indispensable. On a plus le temps de revenir aux fondamentaux...

    Sinon, apprend séparément à faire correctement une copie de fichiers binaires...

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 32
    Points : 10
    Points
    10
    Par défaut Récupération des données dans un serveur et les envoyer dans un réseau local en UDP
    je suis sous linux mais le programme que je vien de te donner et un programme qui est executé comme serveur et mon client et une autre application qui sera lancé dans le meme systeme avec une adresse IP local 127.0.0.1

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/07/2015, 13h36
  2. Réponses: 3
    Dernier message: 11/04/2007, 15h01
  3. Réponses: 1
    Dernier message: 31/01/2007, 12h59
  4. Réponses: 2
    Dernier message: 21/05/2006, 15h02
  5. Réponses: 3
    Dernier message: 23/04/2006, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo