Comment puis-je obtenir le port TCP local et l’adresse IP de mon programme client?

Je prépare un projet de travail simple et j’essaie de me familiariser avec les bases de la programmation socket dans un environnement de développement Unix. À ce stade, j’ai un code de base côté serveur et une configuration de code côté client pour communiquer. Actuellement, mon code client se connecte avec succès au code du serveur et le code du serveur lui envoie un message de test, puis les deux quittent. Parfait! C’est exactement ce que je voulais accomplir. Maintenant, je joue avec les fonctions utilisées pour obtenir des informations sur les deux environnements (serveur et client). Je voudrais obtenir l’adresse IP locale et le port TCP assigné dynamicment du client. La fonction que j’ai trouvé pour le faire est getsockname()

 //setup the socket if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("client: socket"); continue; } //Resortingeve the locally-bound name of the specified socket and store it in the sockaddr structure sa_len = sizeof(sa); getsock_check = getsockname(sockfd,(struct sockaddr *)&sa,(socklen_t *)&sa_len) ; if (getsock_check== -1) { perror("getsockname"); exit(1); } printf("Local IP address is: %s\n", inet_ntoa(sa.sin_addr)); printf("Local port is: %d\n", (int) ntohs(sa.sin_port)); 

mais la sortie est toujours nulle …

 Local IP address is: 0.0.0.0 Local port is: 0 

Est-ce que quelqu’un voit quelque chose que je pourrais être ou est-ce que je me trompe définitivement?

Merci d’avance pour toute votre aide!

De l’apparence de votre code, vous ne connect ou accept sur le socket. Jusqu’à ce que vous ayez fait cela, les données que vous obtenez de getsockname sont indéfinies.

Je ne pense pas que vous puissiez appeler de manière significative getsockname dans ce contexte tant que vous n’avez pas appelé connect () – le kernel ne le lie pas à un port particulier tant qu’il n’a pas besoin l’adresse est choisie en fonction de la table de routage, et donc de la destination.