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

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Sans emploi - Autonome
    Inscrit en
    mars 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Sans emploi - Autonome

    Informations forums :
    Inscription : mars 2018
    Messages : 124
    Points : 35
    Points
    35

    Par défaut Communication entre serveur.c et un client.py sur Raspberry pi 3+

    Bonjour à tous,

    Je suis actuellement entrain de réaliser un programme qui me permettra par la suite de réaliser une communication entre un client et un serveur. Pour cela, je me suis appuyer du tutoriel suivant : https://python.developpez.com/cours/...=page_20#L20-A

    Jusqu'à présent j'arrive à établir une connexion entre mon client et mon serveur mais je n'arrive pas à envoyer un message bidon depuis mon client.py et à le récupérer sur mon serveur.c .

    J'aimerai que mon programme client.py envoie le message suivant : Hello ! à mon serveur.c

    Donc j'ai utilisé les fonctions recv() et send() et j'ai initialisé un message de cette manière :

    msgClient = input("C> HELLO")
    mySocket.send(msgClient.encode("Utf8"))

    Mais quand je lance mon programme client.py , j'ai un message comme quoi la connexion à été établie des deux côtés ce qui est tout à fait normal ... mais pas mon message (HELLO) côté serveur.


    Voici mon code pour le SERVEUR :

    Code c : 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
     
    /*
        C socket server example
    */
     
    #include<stdio.h>
    #include<string.h>    //strlen
    #include<sys/socket.h>
    #include<arpa/inet.h> //inet_addr
    #include<unistd.h>    //write
     
    int main(int argc , char *argv[])
    {
        int socket_desc , client_sock , c , read_size;
        struct sockaddr_in server , client;
        char client_message[2000];
     
        //Create socket
        socket_desc = socket(AF_INET , SOCK_STREAM , 0);
        if (socket_desc == -1)
        {
            printf("Could not create socket");
        }
        puts("Socket created");
     
        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
     
        server.sin_addr.s_addr = inet_addr("127.0.0.1"); //on se met en local
        server.sin_port = htons( 6666 ); //on sélectionne le port
     
        //Bind
        if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
        {
            //print the error message
            perror("bind failed. Error");
            return 1;
        }
        puts("bind done");
     
        //Listen
        listen(socket_desc , 3);
     
        //Accept and incoming connection
        puts("Waiting for incoming connections...");
        c = sizeof(struct sockaddr_in);
     
        //accept connection from an incoming client
        client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
        if (client_sock < 0)
        {
            perror("accept failed");
            return 1;
        }
        puts("Connection accepted");
     
        //Receive a message from client
        while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 )
        {
            //Send the message back to client
            write(client_sock , client_message , strlen(client_message));
        }
     
        if(read_size == 0)
        {
            puts("Client disconnected");
            fflush(stdout);
        }
        else if(read_size == -1)
        {
            perror("recv failed");
        }
     
        return 0;
    }

    et voici le code pour le CLIENT :

    Code python : 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
     
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
     
    import RPi.GPIO as GPIO
    import MFRC522
    import signal
    import socket, sys
     
    HOST = '127.0.0.1'
    PORT = 6666
     
    # 1) création du socket :
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    # 2) envoi d'une requête de connexion au serveur :
    try:
      mySocket.connect((HOST, PORT))
    except socket.error:
      print("La connexion a échoué.")
      sys.exit()
    print("Connexion établie avec le serveur.")
     
     
    # 3) Dialogue avec le serveur :
    msgServeur = mySocket.recv(1024).decode("Utf8")
    while 1:	
      if msgServeur.upper() == "FIN" or msgServeur =="":
          break
      print("S>", msgServeur)
      msgClient = input("C> HELLO")
      mySocket.send(msgClient.encode("Utf8"))
      msgServeur = mySocket.recv(1024).decode("Utf8")
     
    # 4) Fermeture de la connexion :
    print("Connexion interrompue.")
     
    mySocket.close()

    Pouvez vous m'aider svp ? je suis bloqué.

  2. #2
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2006
    Messages : 416
    Points : 489
    Points
    489

    Par défaut

    Bonjour, c'est très simple.

    "J'aimerais que mon programme client.py envoie le message suivant : Hello ! à mon serveur.c"
    Le client fait un recv() (ligne 26) au lieu de faire un send().

    Pour le serveur
    Ligne 58 enlever le while et les accolades: faire un recv(), et rien d'autre.
    Supprimer les ligne 59,60,61,62.
    Si tu laisses le while ça sera ce qu'on appelle un serveur echo, mais ce n'est pas ce qui est demandé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
             // lit le message du client
             read_size = recv(client_sock , client_message , 2000 , 0);
            //Send the message back to client
            //write(client_sock , client_message , strlen(client_message));
    Et en option mode performances ligne 61 pour le write(): remplacer le strlen(client_message) par read_size qui est retourné par recv();
    A ce stade, le serveur va se mettre en écoute, accepter le premier qui se connecte, lire ce que dit le client, puis fermer.

    Pour le client
    Le code python semble se connecter au serveur.
    Mais Ligne 26 il fait un recv() et non un send() comme demandé.
    Donc remplacer les lignes 25,26,27,28,29,30,31,32,33 par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msg = u"Hello !"
    socket.send(msg.encode('utf8'))

Discussions similaires

  1. [SP-2007] Gestion des blob externes et communication entre serveurs
    Par gobelet dans le forum SharePoint
    Réponses: 2
    Dernier message: 14/04/2011, 09h08
  2. Communication entre serveur web et prog VB
    Par christgh dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/04/2008, 13h36
  3. communication entre serveurs
    Par sandouch dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 21/10/2007, 14h20
  4. Communication entre serveurs
    Par fefay dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/06/2007, 16h27

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