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 :

Socket C : typedef int SOCKET [Tutoriel]


Sujet :

Réseau C

  1. #1
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut Socket C : typedef int SOCKET
    Bien le bonjour

    J'ai commencé à programmer des sockets en C il y a peu de temps et j'ai 2-3 points que j'aimerais éclaircir.

    * Tout d'abord, les sockets sous Windows sont déclarés comme suit :
    SOCKET sock;
    tandis que sur Unix, si j'ai bien compris, on utilisait le format int :
    int sock;
    Etant donné que dans le header winsock2 on a typedef int SOCKET, peut-on utiliser int à la place de SOCKET dans une application Windows ?

    * Ma seconde question concerne les infos clients. Sur le programme serveur que j'ai réalisé, j'ai créé une SOCKADDR_IN Sin2; pour stocker les infos clients. Je pense qu'en utilisant la fonction getpeername();, je peux stocker les données clients dans Sin2, non ? Dans ce cas, comment puis-je par exemple afficher l'adresse IP de la machine qui se connecte ? Faut-il convertir Sin2.sin_addr.s_addr avant de l'afficher ?

    * Enfin, je me demande si un client peut autant envoyer que recevoir, pareil pour le serveur. Ont-ils chacun besoin d'une partie serveur et client ou bien une seule suffit-elle ?

    Merci de me répondre,

    Fred

  2. #2
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    pour ta première question, je pense que les sockets peuvent êre déclaré en tant que int que sous linux (pas sur)
    Compil your life guy!
    The Aures Project

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    peut-on utiliser int à la place de SOCKET dans une application Windows ?
    Oui. typedef définit des alias.

    Enfin, je me demande si un client peut autant envoyer que recevoir, pareil pour le serveur.
    Bien entendu.

    Dans ce cas, comment puis-je par exemple afficher l'adresse IP de la machine qui se connecte ?
    inet_ntoa()
    Boost ftw

  4. #4
    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 : 67
    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 Re: Socket C : typedef int SOCKET
    Citation Envoyé par Freed0
    J'ai commencé à programmer des sockets en C il y a peu de temps et j'ai 2-3 points que j'aimerais éclaircir.

    * Tout d'abord, les sockets sous Windows sont déclarés comme suit :
    SOCKET sock;
    tandis que sur Unix, si j'ai bien compris, on utilisait le format int :
    int sock;
    Etant donné que dans le header winsock2 on a typedef int SOCKET, peut-on utiliser int à la place de SOCKET dans une application Windows ?
    Je conseille de laisser SOCKET et de créer un petit fichier d'entête assurant la portabilité (Portable SOCKet)
    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
     
    /* psock.h */
    #ifndef H_PSOCK
    #define H_PSOCK
     
    #ifdef WIN32
    #include <winsock2.h>
    #else
    /* inclure ce qu'il faut pour unixoide... */
    typedef int SOCKET;
     
    /* etc. Par exemple... */
    #define closesocket(a) close(a)
     
    #endif
     
    #endif /* guard */
    Faut-il convertir Sin2.sin_addr.s_addr avant de l'afficher ?
    Oui. http://www.linux-kheops.com/doc/man/manfr/man-ascii-0.9/man3/inet_addr.3.txt.html
    * Enfin, je me demande si un client peut autant envoyer que recevoir,
    Ben oui... Client / serveur, ça veut pas dire émetteur / recepteur... Chaque client emet et reçoit. Pareil pour un serveur. Ce qui change c'est la manière de fonctionner, qui est liée à l'architecture du réseau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Client --------requete------->Serveur
     
    Client <-------reponse-------Serveur
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Merci bien

  6. #6
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Que pensez-vous de ce mini-tuto ? Je l'ai rédigé ce soir et j'aimerais que quelqu'un le debug

    Merci

  7. #7
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    moi j'en pense qu'il est au format *.doc... je ne peux pas aller plus loin.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  8. #8
    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 : 67
    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 Freed0
    Que pensez-vous de ce mini-tuto ? Je l'ai rédigé ce soir et j'aimerais que quelqu'un le debug
    C'est pas mal, mais il ne faut pas confondre AF_INET et PF_INET, même si cette confusion est fréquente.

    PF = Protocol Family. C'est pour le paramètre de socket()
    AF = Address Family. C'est pour la structure d'adressage (SOCKADDR_IN).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char msg[15] = "Hello !\r\n" ;
    <...>
    send(Sock2, msg, sizeof(msg), 0) ;
    Non. Tu vas d'envoyer des 0 en ligne, ce qui n'a aucun intérêt pour tu texte. L'important est le séparateur "\r\n" qui marque la fin de ligne.
    send (Sock2, msg, strlen(msg), 0) ;[/code]
    et comme je m'y attendais, boum ! (95% des erreurs dans les programmes utilisant les sockets viennent de là)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char msgrecu[50] = "";
    <...>
       recv(Sock1, msgrecu, sizeof(msgrecu), 0) ;
     
       printf("Données reçues : %s", msgrecu) ;
    Pour recevoir du texte, il faut :
    • ménager une place pour le 0
    • lire la valeur retournée par recv()
    • s'en servir pour savoir si on a reçu quelquechose, et combien
    • l'utiliser pour placer un 0 dans le tableau.
    • Vérifier qu'on a bien une ligne complète.
    • Nettoyer la ligne.

    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
     
       char msgrecu[50];
       <...>
       int n = recv(Sock1, msgrecu, sizeof msgrecu - 1, 0) ;
       if (n > 0)
       {
          msgrecu[n] = 0;
          char *p = strstr (msgrecu, "\r\n");
     
          if (p != NULL)
          {
             *p = 0;
             printf("Données reçues : %s\n", msgrecu) ;
          }
          else
          {
             printf ("missing characters\n");
          }
       }
    ou un code pour 'assembler' les lignes reçues.

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module REC

    Il manque une petite explication sur les modes connectés ou non (TCP vs UDP, par exemple)

    http://emmanuel-delahaye.developpez.com/reseaux.htm
    Pas de Wi-Fi à la maison : CPL

  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 : 67
    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 gene69
    moi j'en pense qu'il est au format *.doc... je ne peux pas aller plus loin.
    Racisme primaire ou incompétance ?

    http://fr.openoffice.org/
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Je te remercie d'avoir investi un peu de ton temps dans mon texte
    Je souhaite aussi dire que ton site (ou du moins la partie réseau) est très bien réalisée, et qu'il devrait peut-être repris dans les tuto du site

    Pour gene69, je suis désolé, mais je comptais le mettre en html plus tard, le format doc me servant de brouillon... ms comme l'a dit Emmanuel, OpenOffice s'en charge sans problèmes :o

    Pour ce qui est du sujet en lui-même, j'ai bien compris la nuance entre PF_INET et AF_INET que je ne connaissais pas .
    Je vais tenter de me pencher un peu du coté de la vérification de données/connexion comme tu me l'as suggeré .

    Encore merci 8)

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    gene69 a écrit:
    moi j'en pense qu'il est au format *.doc... je ne peux pas aller plus loin.

    Racisme primaire ou incompétance ?
    Salut.
    Je pense un peu comme gene69, car si l'on fait un tuto, c'est pour apporté la connaissance à un maximum de gens. Et donc passé par un format propriétaire, n'est pas un bon pas vers ce but.

    Installer openOffice, c'est se faire "braire" pour être compatible avec MS. Même si MS est la réalité de la vie informatique, ce n'est pas une raison pour insister dans ce sens. Se faire avoir et en être content c'est pas bien.

    La normalité n'est pas MS. C'est tout ce que je voulais dire. Sans méchansté aucune.

    Voilavoila
    A+

  12. #12
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Aucun problème, comme dis ci plus haut, cela me servait de brouillon...

    Enfin j'essaierai de mettre ca en html ce soir ou demain

    P.S. : Oubliez pas que WordPad lit les .doc

  13. #13
    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 : 67
    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 Freed0
    Aucun problème, comme dis ci plus haut, cela me servait de brouillon...

    Enfin j'essaierai de mettre ca en html ce soir ou demain

    P.S. : Oubliez pas que WordPad lit les .doc
    Sous Linux, ça va pas le faire...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'ai rien dit

  15. #15
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Pour ceux que ca botte toujours :

    http://tera-hardware.be/test/

  16. #16
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Pas encore

  17. #17
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'ai encore une question :

    Sur ton site, on a cette ligne à un moment donné :

    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
    int sock_err;
     
    /* to be continued ... */
     
    printf ("closing socket %d...\n", sock);
     
    /* close the socket. */
    sock_err = closesocket (sock), sock = INVALID_SOCKET;  <== CELLE-CI
     
    printf ("the socket is now closed\n");
     
    if (sock_err)
    {
        perror ("socket.close");
        err = 1;
    }
    Je ne comprend pas cmt ça fonctionne... à quoi sert la virgule ?

  18. #18
    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 : 67
    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 Freed0
    Sur ton site, on a cette ligne à un moment donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* close the socket. */
    sock_err = closesocket (sock), sock = INVALID_SOCKET;  <== CELLE-CI
    Je ne comprend pas cmt ça fonctionne... à quoi sert la virgule ?
    Simplement à préciser l'ordre dans lequel se font les opérations (de gauche à droite), et à empécher un gugus de venir mettre une instruction entre les deux. Si j'avais écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sock_err = closesocket (sock);
    sock = INVALID_SOCKET;
    j'augmentais les chances de voir un jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       sock_err = closesocket (sock);
     
       send(sock, ...);
     
       sock = INVALID_SOCKET;
    Avec la virgule, il faut le vouloir quand même. Ca calme !

    Je fais ça aussi (et surtout) avec les pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       free (p), p = NULL;
     
       fclose (fp), fp = NULL;
    etc.

    Incidemment, mes indenteurs (GNUIndent, plug-in code::blocks) ont la gentillesse de laisser la ligne intacte, ce qui reforce l'aspect 'bétonné' ou 'unitaire' du groupe d'instruction. Ce n'est que de la cuisine. Rien de fonctionnel...
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Merci de l'info

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [socket] Communication entre 2 sockets
    Par Trunks dans le forum Réseau
    Réponses: 5
    Dernier message: 05/04/2007, 10h58
  2. [Sockets] classe dérivant de Socket()
    Par gailup dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/03/2007, 18h21
  3. [.NET 2.0 Socket] Remoting, Winsock ou sockets en .NET ?
    Par Aspic dans le forum Framework .NET
    Réponses: 4
    Dernier message: 03/02/2007, 19h09
  4. [socket/ereg] probléme script socket
    Par UNi[FR] dans le forum Langage
    Réponses: 2
    Dernier message: 06/06/2006, 16h36
  5. [Socket][C++]Utilisation des sockets sur internet
    Par ChriGoLioNaDor dans le forum Développement
    Réponses: 8
    Dernier message: 13/01/2006, 21h38

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