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

C++ Discussion :

Problème avec ma socket C++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 56
    Points : 39
    Points
    39
    Par défaut Problème avec ma socket C++
    Bonjour à tous,
    alors voila, je créé deux socket, une qui attend et lit, l'autre qui se connecte à la première et qui lui envoi le message.
    Tous marche bien, ma socket se connecte à la première puis lui envoi le message que j'ai instancié à "coucou", la deuxième socket écoute et affiche la chaine de caractère envoyée.
    Mon problème est que lorsque je quitte mon application qui écoute, la console plante, avec un jolie pop-up "Le programme à cessé de fonction" et je trouve cela franchement gênant mais si mon objectif principale qui était d'envoyer une chaine de caractère d'un PC à un autre est rempli.

    Je ne sais pas pourquoi, je ne vois aucun problème dans mon code, le voici :

    SOURCE écoute :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #if defined (WIN32) // Verifie si l'OS est Windows ou un autre.
        #include <winsock2.h>
        typedef int socklen_t;
    #elif defined (linux)
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define PORT 23
     
     
     
    int main(void)
    {
        #if defined (WIN32)
            WSADATA WSAData;
            int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
        #else
            int erreur = 0;
        #endif
     
        SOCKET sock;
        SOCKADDR_IN sin;
        SOCKET csock;
        SOCKADDR_IN csin;
        char chaine[32] = "Bonjour !";
        socklen_t recsize = sizeof(csin);
        int sock_err;
     
        /* Si les sockets Windows fonctionnent */
        if(!erreur)
        {
            sock = socket(AF_INET, SOCK_STREAM, 0);
     
            /* Si la socket est valide */
            if(sock != INVALID_SOCKET)
            {
                printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
     
                /* Configuration */
                sin.sin_addr.s_addr    = htonl(INADDR_ANY);   /* Adresse IP automatique */
                sin.sin_family         = AF_INET;             /* Protocole familial (IP) */
                sin.sin_port           = htons(PORT);         /* Listage du port */
                sock_err = bind(sock, (SOCKADDR*)&sin, sizeof(sin));
     
                /* Si la socket fonctionne */
                if(sock_err != SOCKET_ERROR)
                {
                    /* Démarrage du listage (mode server) */
                    sock_err = listen(sock, 5);
                    printf("Listage du port %d...\n", PORT);
     
                    /* Si la socket fonctionne */
                    if(sock_err != SOCKET_ERROR)
                    {
                        /* Attente pendant laquelle le client se connecte */
                        printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
     
                        csock = accept(sock, (SOCKADDR*)&csin, &recsize);
                        printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
     
                        /* Si l'on reçoit des informations : on les affiche à l'écran */
                        if(recv(csock, chaine, 300, 0) != SOCKET_ERROR)
                            printf("Recu : %s\n", chaine);
     
                        /* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
                        shutdown(csock, 2);
                    }
                }
     
                /* Fermeture de la socket */
                printf("Fermeture de la socket...\n");
                closesocket(csock);
                closesocket(sock);
     
                printf("Fermeture du serveur terminee\n");
            }
            WSACleanup();
        }
     
        /* On attend que l'utilisateur tape sur une touche, puis on ferme */
        system("PAUSE");
     
        return 0;
    }
    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
     
    #if defined (WIN32)
        #include <winsock2.h>
        typedef int socklen_t;
    #elif defined (linux)
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #define PORT 23
     
     
     
    int main(void)
    {
        #if defined (WIN32)
            WSADATA WSAData;
            int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
            int sock_err=0;
        #else
            int erreur = 0;
        #endif
     
        SOCKET sock;
        SOCKADDR_IN sin;
        char chaine[32] = "coucou";
     
        /* Si les sockets Windows fonctionnent */
        if(!erreur)
        {
            /* Création de la socket */
            sock = socket(AF_INET, SOCK_STREAM, 0);
     
            /* Configuration de la connexion */
            sin.sin_addr.s_addr = inet_addr("127.0.0.1");
            sin.sin_family = AF_INET;
            sin.sin_port = htons(PORT);
     
     
            /* Si l'on a réussi à se connecter */
            if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
            {
                printf("Connection à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
     
               sock_err = send(sock, chaine, 300, 0);
     
                /* Il ne faut pas oublier de fermer la connexion (fermée dans les deux sens) */
                shutdown(sock, 2);
            }
            /* sinon, on affiche "Impossible de se connecter" */
            else
            {
                printf("Impossible de se connecter\n");
            }
     
            /* On ferme la socket */
            closesocket(sock);
     
            WSACleanup();
        }
     
        /* On attend que l'utilisateur tape sur une touche, puis on ferme */
        system("PAUSE");
     
        return EXIT_SUCCESS;
    }
    En attendant votre aide,
    Cordialement,
    GibsonSG_76

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Au hasard, la chaine de caractères ne doit-elle pas se terminer avec un NULL ? (ce qui pourrait poser certains problème je penses sinon).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [FLASH MX2004] [XMLSocket] Problème avec serveur socket php
    Par cocodunombril dans le forum Flash
    Réponses: 4
    Dernier message: 03/04/2009, 02h10
  2. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  3. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  4. problème avec des sockets
    Par ddii dans le forum Réseau
    Réponses: 10
    Dernier message: 15/11/2005, 15h53
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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