2010-03-03 4 views
12

Próbuję wysłać ciąg znaków HI do serwera za pośrednictwem protokołu UDP w określonym porcie, a następnie odebrać odpowiedź. Jednak po próbie uzyskania odpowiedzi za pomocą funkcji recvfrom() utknąłem w stanie blokowania. Próbowałem za pomocą podłączonego UDP ale mam:Odbieranie błędu w protokole UDP: odmówiono połączenia

Błąd odbioru w UDP: Connection refused

Co może być tego powody? Serwer nie jest pod moją kontrolą, ale wiem, że działa dobrze.

Dodałem kod

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

Ponieważ 'recvfrom' będzie blokował, dopóki wiadomość nie będzie dostępna w gnieździe, czy na pewno serwer odpowiada na twoją wiadomość? – jschmier

+0

Awaria serwera ma kanoniczne pytanie dotyczące [Odmowa połączenia] (http://serverfault.com/questions/725262/what-causes-the-connection-refused-message). – Raedwald

Odpowiedz

-1

Moje przypuszczenie byłoby, że Twój adres IP jest źle jakoś, czy port jest już używany w jakiś sposób. UDP jest bezpołączeniowy, więc naprawdę nie ma żadnego "połączenia", aby zawieść.

+0

Czy mógł istnieć jakiś powód, dla którego UDP_MSG, który wysyłam, który jest inicjowany jako stała #define UDP_MSG "HI" się nie zgadza? musi być poprawnie wysłany, aby uzyskać odpowiedź z serwera. – sfactor

+0

Cóż ... w samym UDP jest * minimalna * wielkość wiadomości, ale wyobrażam sobie, że warstwa Sockets zajmuje się tym. –

23

Są szanse, że wysyłasz coś do serwera, który nie słucha tego konkretnego portu. To spowodowałoby wysłanie wiadomości icmp, a następne polecenie recvfrom zwróci błąd w przypadku podłączenia gniazda.

Sprawdź za pomocą tcpdump lub wireshark, co się dzieje na drucie.

+7

To jest właściwa odpowiedź - "Odmowa połączenia" z 'recvfrom' jest prawdopodobnie spowodowana przez serwer zwracający odpowiedź ICMP" Port nieosiągalny "dla początkowego żądania UDP. – caf