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 :

Connexion Socket en C sur serv ASTERISK


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Connexion Socket en C sur serv ASTERISK
    Bonjour,
    Je suis actuellement en BTS de développement informatique et mon entreprise me demande d'éffectuer une connexion socket sur un serveur ASTERISK je m'y suis donc mis et ce qu'il en ressort c'est une pauvre ligne qui s'affiche a la fin de l’exécution du programme la ligne étant:
    Asterisk Call Manager/1.1
    je suppose donc que la liaison s’effectue bien.
    lors de la compilation du programme j'obtiens un message d’erreur qui est le suivant:

    connexionsock.c: In function ‘main’:
    connexionsock.c:84:30: warning: comparison between pointer and integer [enabled by default]

    je ne comprend pas bien cette erreur car je ne pense pas avoir utilisé de pointeurs dans mon code.
    voici donc mon code

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <resolv.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <unistd.h>
     
    #define PORT_TIME       13              /* "time" (not available on RedHat) */
    #define PORT_FTP        5038              /* FTP connection port */
    #define SERVER_ADDR     "192.168.112.238"     /* localhost */
    #define MAXBUF          "1024"                    /* DEF Buffer*/
    #define LOGINASTERISK   "AppDWH"                /*login connexion asterisk*/
    #define PASSASTERISK    "AppDWHSecret123"       /*MDP connexion asterisk*/
     
     
    int main()
    {   int sockfd;
        int errno;
        struct sockaddr_in dest;
        char buffer[1024];
        int taille;
     
     
        /*---Open socket for streaming---*/
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
        {
            printf("Socket open fail");
            return 0;
        }
     
        /*---Initialize server address/port struct---*/
        bzero(&dest, sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_port = htons(PORT_FTP);
        if ( inet_aton(SERVER_ADDR, &dest.sin_addr.s_addr) == 0 )
        {
            printf(SERVER_ADDR);
            return 0;
        }
     
        /*---Connect to server---*/
        if ( connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0 )
        {
            printf("Connect fail ");
            return 0;
        }
     
        /*---Get "Hello?"---*/
        while(1)
        {
        taille=recv(sockfd,& buffer,sizeof(buffer),0);
        buffer[taille]='\0';
        printf("%s",buffer);
        if ((taille=='\0')||(recv==-1)) break;
        }
        printf("\n");
     
        /*---Clean up---*/
        printf("close connexion\n");
        close(sockfd);
        return 0;
    }
    Si l'un d'entre vous a une petite idée sur les éventuelles erreurs que j'aurai fais je suis preneur.
    cordialement un apprenti développeur dans l'impasse.
    Bonne journée a tous et bon dev

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Utilise les balises [code] ça sera plus agréable pour tout le monde

    J'ai pas compté pour savoir où était le warning mais cette ligne me saute aux yeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((taille=='\0')||(recv==-1)) break;
    Tu compares la variable 'taille' (int) avec un caractère (char) (d'où le warning j'imagine). Ensuite pour la deuxième condition ça n'est pas correcte, 'recv' n'est pas une variable ici, je me demande comment ça compile, mais peut importe, c'est la variable taille que tu dois tester de nouveau.

    Ainsi ton problème se réglera tout simplement de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(taille < 1) break;

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse effectivement je n'avais pas vu ces balises code je m'en servirais a partir de maintenant.
    j'ai donc tester ta solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(taille < 1) break;
    Mon programme compile maintenant sans warning, donc c'était bien cette ligne qui me posais problème, malgré ça je n'ai toujours qu'une seule ligne qui s'affiche:

    Asterisk Call Manager/1.1

    Si jamais une autre idée vous traverse l’esprit je suis preneur

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Pour la suite il te faudra connaître le protocole, et communiquer avec le serveur via des send/recv. Tes collègues te renseigneront à ce sujet, tu as déjà la connexion initialisée comme tu cherchais à le faire dans ton post initial

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    c'est vrai qu'avec le send ca devrais le faire je vais m'y mettre
    en ce qui concerne les collègues ca va être complexe je suis le seul dev les autres ne font que du réseaux xD
    mais merci a toi

  6. #6
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    peut-être un début de piste pour toi : http://marcelog.github.io/articles/p...roduction.html
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour a tous.
    je me suis donc mis a tester les send afin de passer mes identifiants au serveur asterisk mais je crois ne pas avoir saisi cette fameuse fonction send si l'un d'entre vous pourrais m'éclairer ça serait le top.
    donc voici ce que j’ai commencer a faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*--login-to-asterisk--*/
        send(sockfd, "Action: Login\r\n");
        buffer[taille]='\0';
        printf("%s",buffer);

    bien évidement cella ne marche pas et m'affiche une erreur:

    sock.c:58: warning: passing argument 1 of ‘send’ makes integer from pointer without a cast
    /usr/include/sys/socket.h:141: note: expected ‘int’ but argument is of type ‘char *’
    sock.c:58: error: too few arguments to function ‘send’

    bonne journée et bon dev :)

  8. #8
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Regarde la doc de send sur le net, il te manque le dernier argument de type size_t qui doit correspondre à la longueur de la chaine de caractères. De plus, les / dans la chaine risquent de poser problème.
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    Tout d'abord merci pour vos réponse qui me sont plus qu'utile.

    je continue a mettre a jour ce post ça pourras toujours servir

    Donc je pense presque toucher au but donc voici mon code:

    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
     
    /*****************************************************************************/
    /*** client-socket-Asterisk.c                                              ***/
    /***                                                                       ***/
    /*****************************************************************************/
     
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <resolv.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <unistd.h>
     
    #define PORT_TIME       13              /* "time" (not available on RedHat) */
    #define PORT_FTP        5038              /* FTP connection port */
    #define SERVER_ADDR     "192.168.112.238" /* localhost */
    #define MAXBUF          "1024"            /* DEF Buffer*/
    #define LOGINASTERISK   "username: testA" /*login connexion asterisk*/
    #define PASSASTERISK    "secret: MDPtestA"  /*MDP connexion asterisk*/
    #define ACTION		"Action: login"			/*Action Serv Asterisk*/
    #define EVENT		"Events: on"		/*Action Serv Asterisk*/
    int main()
    {   int sockfd;
        int errno;
        struct sockaddr_in dest;
        char buffer[1024];
        int taille;
        char login;
        int retour;
     
        /*---Open socket for streaming---*/
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
        {
            printf("Socket open fail");
            return 0;
        }
     
        /*---Initialize server address/port struct---*/
        bzero(&dest, sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_port = htons(PORT_FTP);
        if ( inet_aton(SERVER_ADDR, &dest.sin_addr.s_addr) == 0 )
        {
            printf(SERVER_ADDR);
            return 0;
        }
     
        /*---Connect to server---*/
        if ( connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0 )
        {
            printf("Connect fail ");
            return 0;
        }
        /*--login-to-asterisk--*/
        login = send(sockfd,ACTION,sizeof(buffer),0 );
        if (retour == SOCK_STREAM){
        return 0;
    }
        login = send(sockfd,LOGINASTERISK,sizeof(buffer),0 );
        if (retour == SOCK_STREAM){
        return 0;
    }
        login = send(sockfd,PASSASTERISK,sizeof(buffer),0 );
        if (retour == SOCK_STREAM){
        return 0;
    }
        login = send(sockfd,EVENT,sizeof(buffer),0 );
        if (retour == SOCK_STREAM){
        return 0;
    }
      /*  login = send(sockfd,LOGINASTERISK,sizeof(buffer),0 );
        if (retour == SOCK_STREAM){
        return 0;
    }*/
     
        /*---Get "Hello?"---*/
        while(1)
        {
        taille=recv(sockfd,& buffer,sizeof(buffer),0);
        buffer[taille]='\0';
        printf("%s",buffer);
        }
        printf("\n");
     
        /*---Clean up---*/
        printf("close connexion\n");
        close(sockfd);
        return 0;
    }
    Alors maintenant quand je lance mon application il me met un nouveau message d’erreur:
    Asterisk Call Manager/1.1
    Response: Error
    Message: Authentication failed

    Response: Error
    Message: Authentication failed

    ce qui me viens a l’esprit dans un premier temps est un problème de login mot de passe, mais je suis parti vérifier dans mon serv asterisk mes identifiants le chemin d’accès pour les identifiants est le suivant :

    /etc/asterisk/manager.conf

    voici un extrait de mon manager.conf avec mes identifiants

    [testA]
    secret = MDPtestA
    deny=0.0.0.0/0.0.0.0
    permit=127.0.0.1/255.255.255.255
    permit=192.168.112.0/255.255.255.0
    read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
    write = system,call,agent,user,config,command,reporting,originate
    displayconnects = yes

    Donc je suis toujours en pleine quête si quelqu'un i voit plus clair je suis prêt a écouter
    Bonne journée.
    Bon Dev

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Demande à tes collègues, ils ont certainement déjà eu ce problème.
    Ca ira beaucoup plus vite qu'avec nous.

    Vérifie que tu peux te connecter depuis un autre programme (déjà fait), que le service visé existe et est actif.
    Essaie avec la configuration de quelqu'un qui peut se connecter.
    Regarde ton parefeu.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. [WD20] Connexion socket Windev et Asterisk
    Par overchip dans le forum WinDev
    Réponses: 0
    Dernier message: 20/01/2015, 12h01
  2. [MySQL] generer un fichier html a partir de php en interne sur serve
    Par NoobX dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/10/2005, 14h01
  3. Ouvrir une connexion socket
    Par toure32 dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2005, 21h22
  4. connexion socket borland
    Par karl2mil1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/07/2005, 08h11
  5. connexion socket asynchrone
    Par jagboys dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/06/2005, 17h04

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