Récupération du numéro de port à l’aide de l’API winsock sockets

Bien que j’obtienne une valeur non nulle pour le numéro de port du segment de code ci-dessous, la valeur renvoyée pour le port ne correspond pas à la valeur du port utilisée pour établir le socket:

#include  int main(void) { SOCKADDR_IN server; WSADATA wsa; SOCKET s; DWORD dwTime = 1000; if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) { //handle error } if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET) { //handle error } if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&dwTime, sizeof(dwTime)) == SOCKET_ERROR) { //handle error } server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons( 5000 ); //Connect to server if(connect(s , (struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR) { //handle error } //read port number size_t lensin = sizeof(server); if (getsockname(s, (struct sockaddr *)&server, &lensin) == SOCKET_ERROR) perror("getsockname"); else { printf("port number, no byte order reversal: %u\n", server.sin_port); printf("port number, with byte order reversal: %u\n", ntohs(server.sin_port)); } return 0; } 

Pour le port 5000, j’obtiens la valeur suivante:
entrez la description de l'image ici

Avec ou sans inversion d’ordre sur octets (avec ntohs() ), la valeur n’est toujours pas la même. Comment puis-je lire la valeur entière du numéro de port utilisé pour établir la connexion?

getsockname () renvoie le numéro de port local. Étant donné que votre socket n’était pas lié à un port local spécifique lorsque vous avez appelé connect (), un port éphémère aléatoire a été choisi, le port 56179.

Si vous voulez le numéro de port auquel vous vous êtes connecté, utilisez getpeername ()