Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme socket

    24 décembre 2005 à 12:05:17

    Bonjour,
    j'ai fait ce code pour amélioré le TP de mathéo mais il semblerait que le server plante lors de la réception du premier socket. Si quelqu'un à une solution ...
    Ha oui aussi, si il n'y a pas de switch, c'est parceque pour une réson mystère, ils ne marchent pas correctement chez moi :p


    #include <winsock2.h>
    #include <stdio.h>
    #include <time.h>
    #pragma comment(lib, "ws2_32.lib&quot;)

    int main()
    {
            int nbJoueur, nbCherche, essaies = 0;

            printf("Bienvenu sur le jeux du \"Plus ou Moins\" !\n");
            printf("Choisissez le nombre de joueur ( entre 1 et 2 ) : ");
            scanf("%d", &nbJoueur);

            if (nbJoueur == 1)
            {
                    int niveau, nbEntre;
                    printf("Mode un joueur :\n");
                    printf("Choisissez votre difficulte ( entre 1 et 3 ) : ");
                    scanf("%d", &niveau);

                    if ( niveau == 1 )
                    {
                            srand(time(NULL));
                            nbCherche = (rand() % 98) + 1;
                            printf("Vous avez choisis le mode facile : entre 1 et 99.");
                    }
                    if ( niveau == 2 )
                    {
                            srand(time(NULL));
                            nbCherche = (rand() % 298) + 1;
                            printf("Vous avez choisis le mode normale : entre 1 et 299.");
                    }
                    if ( niveau == 3 )
                    {
                            srand(time(NULL));
                            nbCherche = (rand() % 498) + 1;
                            printf("Vous avez choisis le mode difficile : entre 1 et 499.");
                    }

                    while (nbEntre != nbCherche)
                    {
                            printf("Entrez un nombre : ");
                            scanf("%d", &nbEntre);

                            if ( nbEntre > nbCherche ) printf("Moins !");
                            if ( nbEntre < nbCherche ) printf("Plus !");
                            essaies++;
                    }

                    printf("Bravo, vous avez trouve le bon nombre en %d coups !!", essaies);
            }

            if ( nbJoueur == 2 )
            {
                    int choix;
                    printf("Mode 2 joueurs :\n");
                    printf("1 : Heberger une partie\n");
                    printf("2 : Rejoindre une partie\n");
                    printf("Votre choix : ");
                    scanf("%d", &choix);

                    if ( (choix != 1) && (choix != 2) )
                            return 0;

                    //Winsock initialisation

                    WSADATA wsaData;

                    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
                    if ( iResult != NO_ERROR ) return 0;
                    printf("\n1 : Winsock initialise");


                    // Creation du socket + vérification si valide
       
                    SOCKET m_socket;
                    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

                    if ( m_socket == INVALID_SOCKET ) {
                            WSACleanup();
                            return 0;
                    }
                    printf("\n3 : Socket verifie");
                   
                    bool Fin = false;

                    if ( choix == 1 )
                    {
                            printf("\n\nEntrez le nombre secret ( entre 1 et 299 ) : ");
                            scanf("%d", &nbCherche);
                            if ( (nbCherche < 1) || (nbCherche > 299) ) printf("Nombre invalide !");

                                    // Recuperation de l'ip locale
                                    in_addr myaddr_in;
                                    hostent * host;
                                    char szHostName[256];

                                    gethostname(szHostName, sizeof(szHostName));
                                    host = gethostbyname(szHostName);
                                    memcpy(&myaddr_in, host->h_addr, host->h_length);
                                    printf("\n\n2 : Ip locale recupere");


                                    // Bind le socket
                                    sockaddr_in service;

                                    service.sin_family = AF_INET;
                                    service.sin_addr.s_addr = inet_addr( inet_ntoa(myaddr_in) ); // Local
                                    service.sin_port = htons( 27030 );

                                    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
                                            closesocket(m_socket);
                                            return 0;
                                    }
                                    printf("\n4 : Socket binde");
                                   
                                    //-------------------------------------------------
                                    // Ecoute ...
       
                                    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
                                            return 0;
                                    printf("\n5 : Client connecte");

                                    //--------------------------------------------------
                                    // Accept connections.
                                    SOCKET AcceptSocket;

                                    AcceptSocket = SOCKET_ERROR;
                                    while ( AcceptSocket == SOCKET_ERROR ) {
                                            AcceptSocket = accept( m_socket, NULL, NULL );
                                    }

                                    m_socket = AcceptSocket;
                                    printf("\n6 : Socket verifie");

                                    int bytesRecvStart;
                                    bytesRecvStart = SOCKET_ERROR;
                                    char recvStart[2];

                                    while(bytesRecvStart <= 0)
                                            bytesRecvStart = recv( m_socket, recvStart, 32, 0 );

                                    if ( recvStart[0] == 'S')
                                    {
                                            send( m_socket, (const char *)nbCherche, strlen((const char *)nbCherche), 0 );
                                            printf("\n7 : Nombre envoye, connection etablie.\n\n");

                                            while (!Fin)
                                            {
                                                    int bytesRecv = SOCKET_ERROR;
                                                    char recvbuf[2];

                                                    while(bytesRecv <= 0)
                                                    bytesRecv = recv( m_socket, recvbuf, 32, 0 );

                                                    if (recvbuf[0] == 'M')
                                                            printf("Votre amis vient de ce planter, il a mis trop peu !\n");
                                                   
                                                    if (recvbuf[0] == 'P')
                                                            printf("Votre amis est toujours aussi mauvais, il est au dessus de la verite !\n");
                                                   
                                                    if (recvbuf[0] == 'F')
                                                    {
                                                            int bytesRecvCoups = SOCKET_ERROR;
                                                            char recvCoups[3];

                                                            while(bytesRecvCoups <= 0)
                                                            bytesRecvCoups = recv( m_socket, recvCoups, 32, 0 );
                                                            int Coups = (int)recvCoups - 49;
                                                            printf("\nLe client vient de deconecter. Il a gagne en %d coups.", Coups);
                                                            Fin = true;
                                                    }              
                                            }
                                    }
                            }

                    if ( choix == 2 )
                    {
                            int nbEntre;
                            char IP[12];

                            printf("Entrez l'adresse de l'hote : ");
                            scanf("%s", &IP);

                            sockaddr_in clientService;

                            clientService.sin_family = AF_INET;
                            clientService.sin_addr.s_addr = inet_addr( IP );
                            clientService.sin_port = htons( 27030 );       

                            if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
                            {
                                    printf("Erreur a la connection");
                                    WSACleanup();
                                    return 0;
                            }

                            printf("Connection réussi");
                            char sendbuf[2];
                            sendbuf[0] = 'S';
                            send( m_socket, sendbuf, strlen(sendbuf), 0 );

                            int bytesRecvNb = SOCKET_ERROR;
                            char recvNb[2];

                            while(bytesRecvNb <= 0)
                            recv( m_socket, recvNb, 32, 0 );

                            nbCherche = (int)recvNb - 49;

                            while ( nbEntre != nbCherche )
                            {
                                    char sendBuf[2];
                                    scanf("Entrez un nombre : %d", &nbEntre);

                                    if ( nbEntre > nbCherche )
                                    {
                                            printf("C'est trop !");
                                            sendBuf[0] = 'P';
                                            send( m_socket, sendBuf, strlen(sendBuf), 0 );
                                    }

                                    if ( nbEntre < nbCherche )
                                    {
                                            printf("C'est pas assez !");
                                            sendBuf[0] = 'M';
                                            send( m_socket, sendBuf, strlen(sendBuf), 0 );
                                    }
                                    essaies++;
                            }
                            send( m_socket, (const char *)essaies, strlen((const char *)essaies), 0 );
                    }
            }
            return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      24 décembre 2005 à 12:18:03

      Déjà on voit à certain moment un type bool

      Alors que tu dit que c'est du code C

      Tandis que m@t l'a bien dit, pas de bool en C... Faut attendre le Cpp pour ca.

      Pour le reste je ne m'y connais pas assez en Socket pour t'aider ;)

      • Partager sur Facebook
      • Partager sur Twitter
        24 décembre 2005 à 12:32:46

        J'ai un peu mélanger les deux à cause du type bool, mais il me semble que bool est plus léger que int :p
        • Partager sur Facebook
        • Partager sur Twitter
          24 décembre 2005 à 12:44:21

          oui mais il me semble qu'il n'existe pas non plus en C :/
          • Partager sur Facebook
          • Partager sur Twitter
            24 décembre 2005 à 13:20:11

            Citation : dib258

            oui mais il me semble qu'il n'existe pas non plus en C :/


            et alors si il programme avec dev cpp c'est quoi l'problème o_O
            • Partager sur Facebook
            • Partager sur Twitter
              24 décembre 2005 à 15:27:12

              Le problème c'est qu'il utilise des fonctions de C dans un code en C++ (bool = c++, printf() = C), alors qu'il pourrait coder uniquement en C++ ou C plutôt que de mélanger les 2.
              • Partager sur Facebook
              • Partager sur Twitter
                24 décembre 2005 à 16:42:08

                heuu oui peut-être mais qui à une solution à mon problème ?
                • Partager sur Facebook
                • Partager sur Twitter
                  24 décembre 2005 à 16:46:30

                  OMG Image utilisateur

                  Tu pourrais pas attendre un peu le cours sur les fonctions, ca va pas tarder, et ca sera un peu plus lisible...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 décembre 2005 à 21:51:01

                    Citation : Mackila

                    OMG Image utilisateur

                    Tu pourrais pas attendre un peu le cours sur les fonctions, ca va pas tarder, et ca sera un peu plus lisible...



                    Lol :lol: j'avoue que c'est ilisible, je connais bien winsock (j'ai deja fait quelques trucs du genre : chat, backdoor, file transfert etc..) et je pourrais t'aider mais parcontre j'ai absolument pas le courage de lire ton code :euh:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 décembre 2005 à 23:07:27

                      hmm c'est vrai que ce code est illisible mais c'est parceque je l'ai tassé en une seule page :) Je pense pas que l'on puisse poster plus qu'une page sur le forum mais sinon, j'ai une fonction de connection socket qui suit toute les étapes et des fonctions d'envoie et de récéption :D
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Probleme socket

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown