Forum Programmation.c getsockname renvoie une structure vide ...

Posté par  .
Étiquettes : aucune
0
16
juil.
2007
Bonjour à tous.

Je suis confrontée à une erreur bien bizarre sur hpux itanium (oui, je sais c'est pas linux :)

J'ai un serveur qui fait un bind sur une valeur de port 0 (je laisse donc le soin au système de choisir le port pour moi - inutile de me demander pkoi, c'est juste un besoin vital :). Je récupere ensuite le port par un getsockname et je le stoque dans un fichier pour que les clients récuperent le port du serveur.

Bon ca marche sous linux, solaris, windob, hpux .... mais pas hpux itanium (_XOPEN_SOURCE_EXTENDED).

Voila le code qui me pose pb :


#define HERE "get_port_srv"
int get_port_srv(SOCKET sock, char *str, int str_length)
{
struct sockaddr_in address;
SOCKLEN length = sizeof(struct sockaddr_in);

#if defined _XOPEN_SOURCE_EXTENDED
T4((HERE, "_XOPEN_SOURCE_EXTENDED defined => SOCKLEN = socklen_t\n"));
#else
T4((HERE, "_XOPEN_SOURCE_EXTENDED not defined => SOCKLEN = int\n"));
#endif

memset(&address, 0, sizeof(address));

T4((HERE, "[Before getsockname]sock : %d, address : %p, IP = %s, Port = %u \n", sock, &address, inet_ntoa(address.sin_addr), ntohs(address.sin_port)));

if (getsockname(sock, (struct sockaddr *)&address, &length) < 0)
{
TE((HERE, "Error while getting port of server listen socket....\n"));
return -1 ;
}


T4((HERE, "[After getsockname]sock : %d, address : %p, IP = %s, Port = %u \n", sock, &address, inet_ntoa(address.sin_addr), ntohs(address.sin_port)));


if ( ntohs(address.sin_port) <= 0 )
{
APIGC_TE((HERE, "Error while getting server port - bad value (%u)\n", ntohs(address.sin_port)));
return -1 ;
}

WSNPRINTF_S(str, str_length, "%u", ntohs(address.sin_port));

return 0 ;
}
#undef HERE


voila les traces :



+ 2007/07/16 11:57:36 TRACE from init_socket
+ 2007/07/16 11:57:36
+ 2007/07/16 11:57:36 socket : 5
+
+ 2007/07/16 11:57:36 TRACE from bind_socket
+ 2007/07/16 11:57:36 set socket option.
+ 2007/07/16 11:57:36 set non blocking socket.
+ 2007/07/16 11:57:36 socket bind.
+ 2007/07/16 11:57:36 address to bind : IP = 127.0.0.1, Port = 0
+ 2007/07/16 11:57:36 address binded : IP = 127.0.0.1, Port = 0
+
+ 2007/07/16 11:57:36 TRACE from build_socket_srv
+ 2007/07/16 11:57:36 LISTEN - socket 5.

-- 2007/07/16 11:57:36 - ERROR from get_port_srv
2007/07/16 11:57:36 Error while getting GC port - bad value (0)
+
+ 2007/07/16 11:57:36 TRACE from listen_socket
+ 2007/07/16 11:57:36 Putting the socket in listening mode
+
+ 2007/07/16 11:57:36 TRACE from get_port_srv
+ 2007/07/16 11:57:36 _XOPEN_SOURCE_EXTENDED defined => SOCKLEN = socklen_t
+ 2007/07/16 11:57:36 [Before getsockname]sock : 5, address : 9fffffffffffd790, IP = 0.0.0.0, Port = 0
+ 2007/07/16 11:57:36 [After getsockname]sock : 5, address : 9fffffffffffd790, IP = 0.0.0.0, Port = 0
+



voici les options de compil :

-DHPUX_UNIX -DUNIX -g -D_LARGEFILE64_SOURCE +z -DEXTENDED_SUBMISSION_OPTION -DLOG_METADATA_OPTION -DPROCESS_HANDLE_ABSTRACTION_OPTION -D_XOPEN_SOURCE_EXTENDED -DUSE_TSD_PF_LOCAL -DXSR_OPTION

voila les options de link :

-L /usr/lib/hpux64 -lxnet

si qqun a une idee, ca serait bien chouette parceque la je seche complétement ...

++
  • # comme ca au pif

    Posté par  . Évalué à 1.

    tu definis bien ton SOCKLEN en fonction de si tu es ou n'es pas sur
    _XOPEN_SOURCE_EXTENDED

    tu attend donc un socklen_t comme resultat à getsockname()

    mais (helas) il faut peut-etre aussi voir si la fonction "getsockname()" est en mesure de bosser dans cet environnement et est capable de renvoyer autre chose qu'un int
    • [^] # Re: comme ca au pif

      Posté par  . Évalué à 1.

      si tu regardes les traces tu verra que je suis bien dans le cas de la definition de _XOPEN_SOURCE_EXTENDED et que dans ce cas SOCKLEN = socklen_t :

      + 2007/07/16 11:57:36 _XOPEN_SOURCE_EXTENDED defined => SOCKLEN = socklen_t

      par contre, tes deuxieme et troisieme remarques vallent bien que je jette un oeil plus approfondi au retour effectif de getsocklen et pas seulement au resultat dans ma sockaddr_in address... merci donc pour ton aide :)
      • [^] # et que dis perror() ?

        Posté par  . Évalué à 2.

        Quand getsockname() foire, que dis un bon vieux perror() ?.. Je pense que ça mettrait déjà sur une piste...

        Sinon un strace ou ltrace de ton programme donne en général de bons indices (je suppose que ces outils ou équivalents existent sous ce système)
        • [^] # Re: et que dis perror() ?

          Posté par  . Évalué à 1.

          Ok, je repond maintenant meme si j'ai trouvé la solution il y a maintenant qque temps.

          Le code montré plus haut correspond en fait au code d'une api. la compilation de cette api utilisait bien l'option qu'il fallait et donc il n'y avais pas de PB au niveau de la librairie compilée.

          Cependant pour le binaire qui appellait cette api, je n'avais pas mis l'option -D_XOPEN_SOURCE_EXTENDED - intentionnellement, puisqu'a priori dans le code du binaire je n'en avais pas vraiment besoin. Depuis que j'ai rajouté le -D_XOPEN_SOURCE_EXTENDED à la compil du binaire, je n'ai plus ce problème.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.