Erreur compilation, Requette pour Connaitre le premier port ouvert.....

Signaler
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
-
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
-
Bonsoir,
Je souhaiterais avoir un peu d'aide si possible,
pour finir de réalisé un petit programme en c,
Car j'ai rencontré des problèmes,
Sachant que


je compile avec Dev C++

Se Programme a pour but d'afficher a l'écran le premiers port ouvert...

Voici le code source :

####################################################

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
// Inclure dans le projet : libwsock32.a










#define true 1
#define false 0











   /* on initialise notre winsock */
    WSADATA WSAData;
    WSAStartup( MAKEWORD( 2 , 0 ) , &WSAData );
   /* fin d'initialisation */
 
   /* on construit notre socket */
       SOCKET sock;
       SOCKADDR_IN sin;
   /* FIN DE LA CONSTRUCTION */
        
    int Port = 4; // Unassigned Port











    bool Is_Open_Port( int port )
    {
        sock = socket( AF_INET, SOCK_STREAM, 0 );
       
                sin.sin_addr.s_addr = inet_addr( "127.0.0.1" );
                sin.sin_family = AF_INET;
                sin.sin_port = htons( port );
        if(
           (
            connect(
                     sock,
                     ( struct sockaddr* ) &sin,
                     sizeof( struct sockaddr )
                    )
            ) == true
          )
          {
              return false;   
          }
         
        return true;
    }











    int PortConnect( void )
    {
        if( Is_Open_Port( Port ) )
        {
            Port = Port++;
            return PortConnect();
        }
       
        return Port;  
    }













    int main( void )
    {
        printf( "Premier port ouvert : %.f\n" , PortConnect() );
       
        WSACleanup(); //on libére les ressources allouées
        closesocket(sock); //on ferme le socket
        return false;
    }






####################################################

L'erreur étant :
 "expected `,' or `;' before '(' token"
 concernant la ligne en rouge dans le code....

   Merci d'avoir lu jusqu'aux bout, ........       ^^

         Cordialement
                        ~~ DotWizard512 ~~
         

8 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Tu appel WSAStartup en dehors d'une fonction. Hors, en C, l'emplacement de départ, pour une console, est la fonction main. L'execution ne commence pas au début du fichier mais dans la fonction main donc si tu pouvais compiler (supposons que), WSAStartup ne serais jamais executé. Il faut donc que cette fonction soit appeler à partir d'une autre fonction.

C++ (@++)<!--
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
1
Hum, Je vois, merci beaucoup,
sauf que apres avoir remixé mon code,
ormi le fait qu'il le compile correctement,
Il reste une chose qui me gène, le programme marche a moitier,
car il n'affiche rien....   ^^'
Peux etre s'agit t'il du temps de la requette......?!

Code Remixé :

############################################

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
// Inclure dans le projet : libwsock32.a





#define true 1
#define false 0










    int Port = 4; // Unassigned Port







    bool Is_Open_Port( int port )
    {
         /* on initialise notre winsock */
             WSADATA WSAData;
             WSAStartup( MAKEWORD( 2 , 0 ) , &WSAData );
         /* fin d'initialisation */
 
         /* on construit notre socket */
            SOCKET sock;
            SOCKADDR_IN sin;
         /* FIN DE LA CONSTRUCTION */
        
         int a;
        
        sock = socket( AF_INET, SOCK_STREAM, 0 );
       
                sin.sin_addr.s_addr = inet_addr( "127.0.0.1" );
                sin.sin_family = AF_INET;
                sin.sin_port = htons( port );
        if(
           (
            connect(
                     sock,
                     ( struct sockaddr* ) &sin,
                     sizeof( struct sockaddr )
                    )
            ) == true
          )
          {
              a = false;   
          }
           else
          {
              a = true;
          }
         
         WSACleanup(); //on libére les ressources allouées
         closesocket(sock); //on ferme le socket
         
        return a;
    }







    int PortConnect( void )
    {
        if( Is_Open_Port( Port ) )
        {
            Port = Port++;
            return PortConnect();
        }
       
        return Port;  
    }







    int main( void )
    {
        printf( "Premier port ouvert : %d\n" , PortConnect() );
        system( "pause" );
        return false;
    }






############################################

         Cordialement
                          ~~ DotWizard512 ~~

     Merci.....
Messages postés
256
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
6 novembre 2009
1
Bonsoir,
- à tout hazard, tu as vérifié que connect renvoyait bien un "booléen" sous forme d'entier. Je serai toi j'essayerais en virant le ==true

if(
           (
            connect(
                     sock,
                     ( struct sockaddr* ) &sin,
                     sizeof( struct sockaddr )
                    )
            ) <strike>== true
</strike>          )

- D'autre part ton port=port++ me semble un peu douteux, le résultat risque d'être un peu inderminé à mon avis. Tu me diras, comme il évalue la partie droite en premier ca revient de toute manière à faire port++; qui est plus orthodoxe.




Ah ! j'ai trouvé
, tu as une boucle sans fin (quand un port est ouvert) dans ta fonction PortConnect :
int PortConnect( void )
    {
        if( Is_Open_Port( Port ) )
        {
            Port = Port++;
            return PortConnect();
        }
       
        return Port;  
    }


 


Je croise les doigts que c'est ça le problème .
Bon courage !!

Jcbé[^]
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
1
Kel Cretin je suis alors      ^^"
J'avais rien vu venir,
sur les 3 erreurs que tu ma montré y en a,
aux moins 2 que j'aurais pu évité...     La Honte    ^^'

Ba J'ai ReReMixé l'code mais y a toujours le même problème...

Code ReRemixé :

#################################################################

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
// Inclure dans le projet : libwsock32.a





#define true 1
#define false 0










    int Port = 4; // Unassigned Port







    bool Is_Open_Port( int port )
    {
         /* on initialise notre winsock */
             WSADATA WSAData;
             WSAStartup( MAKEWORD( 2 , 0 ) , &WSAData );
         /* fin d'initialisation */
 
         /* on construit notre socket */
            SOCKET sock;
            SOCKADDR_IN sin;
         /* FIN DE LA CONSTRUCTION */
        
         int a;
        
        sock = socket( AF_INET, SOCK_STREAM, 0 );
       
                sin.sin_addr.s_addr = inet_addr( "127.0.0.1" );
                sin.sin_family = AF_INET;
                sin.sin_port = htons( port );
        if(
            connect(
                     sock,
                     ( struct sockaddr* ) &sin,
                     sizeof( struct sockaddr )
                    )
          )
          {
              a = false;   
          }
           else
          {
              a = true;
          }
         
         WSACleanup(); //on libére les ressources allouées
         closesocket(sock); //on ferme le socket
         
        return a;
    }







    int PortConnect( void )
    {
        if( Is_Open_Port( Port ) == false )
        {
            Port++;
            return PortConnect();
        }
       
        return Port;  
    }







    int main( void )
    {
        printf( "Premier port ouvert : %d\n" , PortConnect() );
        system( "pause" );
        return false;
    }










#################################################################






       Merci..........






   Cordialement
                ~~DotWizard512~~



            
Messages postés
256
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
6 novembre 2009
1
J'avoue que je n'ai jamais trop travaillé sur les ports et tout ça mais j'ai fait du C et là il me semble que ca serait encore mieux d'écrire :


(en admettant qu'il y a 4 ports  et que ta fonction soit une fonction de scrutation de ports et renvoie le numéro du dernier port ouvert)

int PortConnect( void )
    {
   int p;
   int port=-1;
while(port==-1)   
{
      for(p=0;p<4;p++)
    




        {
            if( Is_Open_Port( port ))            





            port=p
            }//next      
}//end while
        return port;   

    }





Jcbé[^]
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
1
Non,
ma fonction n'a pas pour but de renvoyer le dernier port ouvert,
mais le premier...        ^^

j'ai testé ta fonction mais c'est toujours le même résultat, aucune réponse a l'écran....

Merci.......
 
     Cordialement
                      ~~DotWizard512 ~~
            
Messages postés
256
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
6 novembre 2009
1
Bonjour,

En fait si tu réfléchis bien, le dernier et le premier c'est exactement la même chôse pour une fonction comme ca , c'est trés rare que deux ports soient ouverts successivement à quelques microsecondes d'intervalle.
D'autre part j'attirai seulement ton attention sur le fait que la récursivité de ta fonction PortConnect est trés jolie mais elle perturbe la bonne lisibilité du code.

Bon, à un de ces 4

Jcbé[^]
Messages postés
459
Date d'inscription
dimanche 9 janvier 2005
Statut
Membre
Dernière intervention
11 mai 2013
1
Ok,
Merci pour tes remarques,
je tacherais d'en prendre compte, ........

Mais sinon quelqu'un pourait m'aider
pour faire fonctionné correctement, mon ProGramMe........?!

   Merci......

          Cordialement
                       ~~ DotWizard512 ~~