2010-03-03 9 views
12

J'essaie d'envoyer une chaîne HI à un serveur via UDP dans un port particulier, puis de recevoir une réponse. Cependant, après avoir essayé d'obtenir la réponse en utilisant recvfrom(), j'étais coincé en état de blocage. J'ai essayé d'utiliser UDP connecté mais je suis:Erreur lors de la réception en UDP: Connexion refusée

Erreur de réception dans UDP: Connexion refusée

Quelles pourraient être les raisons? Le serveur n'est pas sous mon contrôle, mais je sais que cela fonctionne très bien.

J'ai ajouté le code

int sockfdudp; 
char bufudp[MAXDATASIZE], port[6]; 
struct addrinfo hints, *servinfo, *p; 
struct sockaddr_storage addr; 
int rv; 
char s[INET6_ADDRSTRLEN]; 
int bytes_recv, bytes_sent; 
socklen_t len; 

scanf("%s",port); 
printf("UDP Port: %s \n", port); 

// Start connecting to datagram server 
memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_DGRAM; 

if ((rv = getaddrinfo(SERVER_NAME, port, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 

// loop through all the results and make a socket 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfdudp = socket(p->ai_family, p->ai_socktype, 
      p->ai_protocol)) == -1) { 
     perror("Creating datagram socket"); 
     continue; 
    } 

if (connect(sockfdudp, p->ai_addr, p->ai_addrlen) == -1) { 
     close(sockfdudp); 
     perror("Connecting stream socket"); 
     continue; 
    } 
    break; 
} 

if (p == NULL) { 
    fprintf(stderr, "ClientUDP: failed to bind socket\n"); 
    return 2; 
} 


freeaddrinfo(servinfo); 

if ((bytes_sent = sendto(sockfdudp, UDP_MSG, strlen(UDP_MSG), 0, p->ai_addr, p->ai_addrlen)) == -1) { 
    perror("ClientUDP: Error sending data"); 
    exit(1); 
} 
printf("Data %s sent\n", UDP_MSG);  

len = sizeof(struct sockaddr_storage); 

if ((bytes_recv = recvfrom(sockfdudp, bufudp, MAXDATASIZE-1, 0,(struct sockaddr*)&addr, &len)) == -1) { 
    perror("Error receiving in UDP"); 
    exit(1); 
} 

printf("Bytes recv %d\n", bytes_recv); 

bufudp[bytes_recv] = '\0'; 

printf("ClientUDP: Received\n %s \n",bufudp);  

close(sockfdudp); 

return 0; 
+0

Puisque 'recvfrom' bloquera jusqu'à ce qu'un message soit disponible sur le socket, êtes-vous sûr que le serveur répond à votre message? – jschmier

+0

Server Fault a une question canonique sur [Connection Refused] (http://serverfault.com/questions/725262/what-causes-the-connection-refused-message). – Raedwald

Répondre

-1

Je dirais que votre adresse IP est mauvaise en quelque sorte, ou le port est déjà utilisé en quelque sorte. UDP est sans connexion, donc il n'y a pas vraiment de "connexion" pour échouer.

+0

peut-il y avoir une raison pour le UDP_MSG que j'envoie, qui est initialisé comme constante #define UDP_MSG "HI" soit faux? il doit être envoyé correctement pour récupérer toute réponse du serveur. – sfactor

+0

Eh bien ... il y a une taille de message * minimum * dans UDP lui-même, mais j'imagine que la couche Sockets s'en charge. –

23

Les chances sont que vous envoyez quelque chose à un serveur qui n'écoute pas sur ce port particulier. Cela provoquerait un message icmp à renvoyer et votre prochaine recvfrom retournera une erreur dans le cas où vous connectez le socket.

Vérifiez avec tcpdump ou wireshark ce qui se passe sur le fil.

+7

C'est la bonne réponse - la "Connexion Refusée" de 'recvfrom' est probablement due au fait que le serveur retourne une réponse ICMP" Port Unreachable "à la demande UDP initiale. – caf