2010-03-03 10 views
9

Je dois envoyer des données à un serveur distant via UDP dans un port particulier et recevoir une réponse de celui-ci. Cependant, il bloque et je n'obtiens aucune réponse. J'ai besoin de vérifier si la valeur addrinfo que je reçois du getaddrinfo(SERVER_NAME, port, &hints, &servinfo) est correcte ou non.Comment obtenir le numéro de port d'addrinfo dans unix c

Comment puis-je obtenir le numéro de port à partir de cette structure de données? Je sais inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),s, sizeof s) me donne l'adresse IP du serveur. (J'utilise la méthode dans le guide de Beej.)

Répondre

24

Vous faites quelque chose de similaire à ce que la fonction get_in_addr de Beej fait:

// get port, IPv4 or IPv6: 
in_port_t get_in_port(struct sockaddr *sa) 
{ 
    if (sa->sa_family == AF_INET) { 
     return (((struct sockaddr_in*)sa)->sin_port); 
    } 

    return (((struct sockaddr_in6*)sa)->sin6_port); 
} 

Aussi méfiez-vous de l'écueil # 1 portant des numéros de port dans sockaddr_in (ou scokaddr_in6) structures: les numéros de port sont toujours stockés dans l'ordre des octets réseau.

Cela signifie, par exemple, que si vous imprimez le résultat de la « get_in_port » appel ci-dessus, vous devez jeter dans un « ntohs() »:

printf("port is %d\n",ntohs(get_in_port((struct sockaddr *)p->ai_addr))); 
+0

cela semble fonctionner ... Je vois que le port est correct, cependant je reçois un "Erreur de réception dans UDP: Connexion refusée" quand j'essaye d'obtenir une réponse du serveur. pourquoi un tel problème se poserait-il? J'ai essayé connecté UDP – sfactor

+0

"Connexion refusée" signifie généralement qu'il n'y a pas d'écoute de processus sur le port de destination que vous avez spécifié. Cela peut également indiquer qu'un pare-feu vous empêche d'envoyer vers ce serveur/port. –

+0

Ce n'est pas grave, mais on pourrait affirmer (sa-> sa_family == AF_INET6) 'pour l'autre cas, car il y a aussi' AF_IRDA', 'AF_BTH' (Bluetooth),' AF_IPX', 'AF_APPLETALK',' AF_NETBIOS' et peut-être d'autres familles de protocoles pas encore inventées. –

Questions connexes