les sockets en C sous linux
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

les sockets en C sous linux



  1. #1
    cosmoff

    les sockets en C sous linux


    ------

    Bonjour à tous,

    voila j'essaye de faire communiquer mon PC avec ma carte raspberry via les sockets et je coince un peu, à vrai dire je n'arrive pas a connecter mon pc avec la raspberry.

    Le programme sur mon PC (windows) est fait via Qt, qui a une méthode toute faite pour me connecter :
    Code:
    connectToHost(host, port);
    j'ai donc placé
    Code:
    Socket -> connectToHost(10.0.0.1,  15020);
    et le tour est joué.

    mais sur ma carte raspberry je dois tout configurer. Je dois donc définir sur ma raspberry un port sur laquel mon programme sera exécuté. J'ai donc fait :
    Code:
    int main(void){
    
    struct sockaddr_in server;
    socklen_t size;
    
    int fd = socket(AF_INET, SOCK_DGRAM, 0); // la connexion se fait en UDP
    
    server.sin_family = AF_INET;
    server.sin_port = htons(15020);
    
    blind(fd, (struct sockaddr*)&server, sizeof(server));
    size = sizeof(server)
    listen(fd, 1);
    accept(fd, (struct sockaddr*)&server, &size);
    while(1);
    }
    impossible de me connecter avec ce code vous avez des idées ?
    merci d'avance

    -----

  2. #2
    cosmoff

    Re : les sockets en C sous linux

    je vous met mon code complet de mon serveur :
    Code:
    int server, client;
    struct sockaddr_in server_addr;
    socklen_t size:
     
    client = socket(AF_INET, SOCK_DGRAM, 0); // la connexion se fait en UDP
    if(client < 0){
         printf("error socket created");
         exit(1);
    }
    printf("socket succed");
     
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(15020);
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
     
    if(blind(fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
         printf("error bind");
         exit(1);
    }
    printf("bind OK");
    size = sizeof(server_addr)
    listen(fd, 1);
    server = accept(fd, (struct sockaddr*)&server_addr, &size);
    if(server < 0){
         printf("error accept");
         while(server < 0){
              server = accept(fd, (struct sockaddr*)&server_addr, &size);// j'attend que le client se connecte à mon port
         }
    }
     
    while(server > 0){
         printf("connected with client");
         while(1);
    }

  3. #3
    polo974

    Re : les sockets en C sous linux

    comme ce n'est pas indiqué, es-tu sûr d'avoir utilisé un socket udp coté qt?

    sinon coté serveur linux: tu peux voir si ton socket est bien en écoute:
    netstat -puan
    doit te lister les ports ouverts sur ta machine (man netstat pour déguster les options...).

    je suppose qu'en vrai, c'esi bind et non blind qui est codé.
    mais le plus horrible, c'est ton final:
    while(1);
    qui va te bouffer 100% de cpu...

    si tu n'a rien à faire, lance un while(1) sleep(100000); // le nombre de zéro n'a quasiment aucune incidence...
    Jusqu'ici tout va bien...

  4. #4
    cosmoff

    Re : les sockets en C sous linux

    merci beaucoup pour ta réponse,
    alors oui j'ai bien mis bind dans mon code. Je suis un peu documenté et pour la connection UDP le listen et accept sont a retiré ce que j'ai fait, mais quand je fait netstat -puan mon 0.0.0.0:15020 me met son état à vide au lieu de ETABLISHED et je ne sais pas ce que j'ai loupé
    Pour le Qt tout est bon ( config UDP ok) mais c'est la config sur ma raspberry qui ne marche pas.

  5. A voir en vidéo sur Futura
  6. #5
    polo974

    Re : les sockets en C sous linux

    j'avais à peine survolé le code... et j'avais loupé les listen accept en trop... en effet inutile en udp.

    si avec netstat, tu vois une entrée genre:

    udp 0 0 0.0.0.0:15020 0.0.0.0:* 12345/the-program-udp

    c'est que ton programme a bien ouvert en udp sur le bon port.
    il faut juste qu'il y fasse un recvfrom pour choper le premier message qui passe par là...


    tu peux facilement tester en python ton socket:
    Code:
    import socket
    suc=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    suc.sendto("azertyuiopqsdfghjklm",('127.0.0.1', 54321))
    ajuster l'adresse et le port bien sûr...

    et un "serveur":
    Code:
    import socket
    sus=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sus.bind(('', 54321,)) #j'aime bien mettre une virgule "en trop" dans mes tuples...
    data, source = sus.recvfrom(1024)
    
    print data
    print source
    questions annexes:
    est-ce que ton uc qt voit l'uc C (connectées et configurées dans le même réseau) ?
    est-ce que les ports entrants ne sont pas bloqués ?
    est-ce que l'udp n'est pas bloqué ?

    sinon, il y a des outils genre nc et socat qui permettent de faire de "la magie réseau" en ligne de commande...
    (et il y a même des gens qui les ont portés sur wi...ws)
    Jusqu'ici tout va bien...

  7. #6
    cosmoff

    Re : les sockets en C sous linux

    alors la commande netstat me renvoie :
    udp 0 0 0.0.0.0:15020 0.0.0.0:*
    et rien d'autre, je n'ai pas 12345/the-program-udp.

    Ensuite, oui mon client et mon serveur sont bien sur le meme réseau.
    Pour les ports entrants bloqués et l'UDP, je n'en sais rien, comment je peux vérifier ?

  8. #7
    cosmoff

    Re : les sockets en C sous linux

    j'ai oublié de préciser que le code sous python fonctionne, donc probablement un probleme sur mon code en C

  9. #8
    polo974

    Re : les sockets en C sous linux

    netstat ne dit pas tout si tu n'es pas root (PID et non du programme), mais ici, c'est pas grave, on voit que ton port 15020 est ouvert sur toutes les interfaces.

    coté raspberry, j'ose espérer que ce n'est pas bloqué dans la config de base.

    coté winchose, il faut regarder coté sécurité/blocage de port et autres firewalls...
    mais comme tu dois un peu t'en douter, ce n'est pas ma tasse de café (ni mon bol de cidre).

    juste un rappel: baisser le niveau de sécurité veux bien dire ce que ça veut dire... donc gaffe...
    Jusqu'ici tout va bien...

  10. #9
    cosmoff

    Re : les sockets en C sous linux

    j'arrive a transmettre un message avec python entre windows et ma raspberry donc le probleme n'est pas du à un blocage, mais plus à un probleme de code que je n'arrive pas a détecter

Discussions similaires

  1. comment faire communiquer un automate sous linux et un PC sous windows?
    Par gerald2545 dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 27/06/2013, 07h59
  2. USB sous LINUX (HID par PIC)
    Par invite1feace2e dans le forum Électronique
    Réponses: 5
    Dernier message: 21/08/2008, 10h47
  3. Sockets sur une machine
    Par inviteb3f08f17 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 07/07/2008, 15h26
  4. Son à sous-volume sous Linux
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 12/11/2007, 22h03
  5. msn sous linux
    Par invite537de305 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 03/02/2004, 21h50