2010-03-03 14 views
12

से इनकार कर दिया है मैं एक विशेष बंदरगाह में यूडीपी पर एक सर्वर को एक स्ट्रिंग HI भेजने और फिर प्रतिक्रिया प्राप्त करने की कोशिश कर रहा हूं। हालांकि, मैं revfrom() का उपयोग कर प्रतिक्रिया प्राप्त करने का प्रयास करने के बाद मैं राज्य को अवरुद्ध करने में फंस गया था। मैं जुड़ा यूडीपी का उपयोग कर की कोशिश की लेकिन मुझे मिल गया:यूडीपी में प्राप्त होने में त्रुटि: कनेक्शन ने

त्रुटि यूडीपी में प्राप्त: कनेक्शन अस्वीकृत

क्या इसके कारण हो सकता है? सर्वर मेरे नियंत्रण में नहीं है, लेकिन मुझे यह ठीक काम करने के बारे में पता है।

मैं कोड को शामिल किया है

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

चूंकि सॉफ़्ट पर एक संदेश उपलब्ध होने तक 'recvfrom' अवरुद्ध होगा, क्या आप सुनिश्चित हैं कि सर्वर आपके संदेश का जवाब दे रहा है? – jschmier

+0

सर्वर फॉल्ट के पास [कनेक्शन अस्वीकार] के बारे में एक कैननिकल प्रश्न है (http://serverfault.com/questions/725262/what-causes-the-connection-refused-message)। – Raedwald

उत्तर

-1

मेरा अनुमान होगा कि आपके आईपी पते किसी भी तरह बुरा है, या पोर्ट किसी भी तरह से प्रयोग में है। यूडीपी कनेक्शन रहित है, इसलिए असफल होने के लिए वास्तव में कोई "कनेक्शन" नहीं है।

+0

क्या मैं भेज सकता हूं कि UDP_MSG के लिए कोई कारण हो सकता है, जिसे निरंतर परिभाषित किया गया है #Dfine UDP_MSG "HI" गलत है? सर्वर से किसी भी प्रतिक्रिया को वापस पाने के लिए इसे सही ढंग से भेजने की आवश्यकता है। – sfactor

+0

अच्छा ... यूडीपी में एक * न्यूनतम * संदेश आकार है, लेकिन मुझे लगता है कि सॉकेट परत उस पर ध्यान रखती है। –

23

संभावना है कि आप किसी ऐसे सर्वर को कुछ भेज रहे हैं जो उस विशेष बंदरगाह पर नहीं सुनता है। इससे एक आईसीएमपी संदेश वापस भेजा जाएगा, और आपका अगला रिकॉर्फ़ उस मामले में एक त्रुटि लौटाएगा जहां आप सॉकेट कनेक्ट करते हैं।

तार पर क्या चल रहा है tcpdump या wireshark के साथ जांचें।

+7

यह सही उत्तर है - 'रिक्रॉफॉम' से "कनेक्शन रिफ्यूज्ड" काफी संभवतः सर्वर द्वारा प्रारंभिक यूडीपी अनुरोध के लिए आईसीएमपी "पोर्ट पहुंच योग्य" प्रतिक्रिया लौटने के कारण होता है। – caf