UDP socket not responding -


मैं c udp सॉकेट का एक नमूना लिख ​​रहा हूँ I यह क्लाइंट है

  #include & lt; stdlib.h & gt; # शामिल करें & lt; stdio.h & gt; # शामिल करें & lt; sys / socket.h & gt; #include & lt; netinet / in.h & gt; # शामिल करें & lt; netdb.h & gt; #include & lt; string.h & gt; # शामिल करें & lt; arpa / inet.h & gt; Int main (int argc, char * argv []) {if (argc & lt; 3) {fprintf (stderr, "उपयोग:% s ip port \ n", argv [0]); बाहर निकलने के (1); } Int sock; char * server_ip; अहस्ताक्षरित छोटा server_port; struct sockaddr_in cliAddr, serAddr; अगर ((sock = socket (AF_INET, SOCK_DGRAM, 0)) & lt; 0) {fprintf (stderr, "सॉकेट असफल \ n"); बाहर निकलने के (1); } Server_ip = argv [1]; server_port = atoi (argv [2]); मेम्सेट (& amp; cliAddr, 0, sizeof (cliAddr)); cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl (INADDR_ANY); cliAddr.sin_port = htons (21152); अगर (बाँध (जुर्राब, (स्ट्रकचर सॉकडार *) और क्लीएडडर, आकारफ (स्ट्रक्चर सॉकड्रर)) & lt; 0) {एफप्रिंटफ़ (स्टेडरर, "बाइंड असफल \ n"); बाहर निकलने के (1); } मेमेसेट (& amp; serAddr, 0, sizeof (serAddr)); serAddr.sin_family = AF_INET; serAddr.sin_addr.s_addr = inet_addr (server_ip); serAddr.sin_port = htons (server_port); अगर (प्रेषण, "नमस्ते", 5, 0, (स्ट्रेट सोकैड * * (& amp; serAddr), आकार (serAddr)) == -1) {fprintf (stderr, "sendto विफल \ n"); बाहर निकलने के (1); } Printf ("सफलता भेजें \ n"); Int n; चार रिकॉर्स्ट [50]; अगर ((n = रिकवफ्रॉम (जुर्राब, और रिकवस्ट्रेट, 50, 0, नल, नल)) 0} {fprintf (stderr, "recvfrom विफल \ n"); बाहर निकलने के (1); } Printf ("सफलता प्राप्त:% s \ n", recvstr); Printf ("% s से:% d \ n", inet_ntoa (serAddr.sin_addr), ntohs (serAddr.sin_port)); बाहर निकलने के (0); }   

और यह सर्वर है

  #include & lt; stdio.h & gt; # शामिल करें & lt; stdlib.h & gt; # शामिल करें & lt; sys / socket.h & gt; #include & lt; string.h & gt; # शामिल करें & lt; arpa / inet.h & gt; Int main (int argc, char * argv []) {if (argc & lt; 2) {fprintf (stderr, "उपयोग:% s पोर्ट \ n", argv [0]); बाहर निकलने के (1); } इंट सॉक, एन; सर्किट सर्कड्रर, क्लाइडर; चार रिकॉर्स्ट [50]; Socklen_t क्लीएडडेलन; अगर ((sock = socket (AF_INET, SOCK_DGRAM, 0)) & lt; 0) {fprintf (stderr, "सॉकेट असफल \ n"); बाहर निकलने के (1); } मैम्सटेट (& amp; servaddr, 0, आकार (servaddr)); Servaddr.sin_family = AF_INET; Servaddr.sin_addr.s_addr = htonl (INADDR_ANY); Servaddr.sin_port = htons (atoi (argv [1])); अगर (बाँध (जुर्राब, (स्ट्रकचर सॉकडार *) और सर्विसड्रर, आकारफ (सर्विसडाटर)) & lt; 0) {एफप्रिंटफ (स्टेडरर, "बाइंड असफल \ n"); बाहर निकलने के (1); } क्लीएडडर्लिन = आकारफ (क्लिआडर); अगर ((n = रिकवफ्रॉम (सोक, रिकवस्ट्रेट, 50, 0, (स्ट्रक्चर सोकैडार *) और क्लिडर, और क्लैडडलन)) & lt; 0) {एफप्रिंटफ (स्टेडरर, "रिकव फ्रॉम असफल \ n"); बाहर निकलने के (1); } Printf ("ग्राहक आईपी:% s, क्लाइंट पोर्ट:% d \ n", inet_ntoa (cliaddr.sin_addr), ntohs (cliaddr.sin_port)); अगर (सेट, "सर्वर से नमस्ते", 17, 0, (स्ट्रक्चर सोकैडार *) और क्लीडर, क्लिएड्र्लेंन) == -1) {एफप्रिंटफ (स्टेडरर, "सेट्टो असफल \ n"); बाहर निकलने के (1); } Printf ("सफलता भेजें \ n"); बाहर निकलने के (0); }   

क्लाइंट और सर्वर स्थानीय में हैं जब यह ठीक काम करता है जैसे "./server 21151" और "./client 127.0.0.1 21151" सर्वर प्राप्त होगा:

  ग्राहक आईपी: 127.0.0.1, ग्राहक पोर्ट: 21152 सफलता भेजें   

और ग्राहक मिल जाएगा: < पूर्व> सफलता प्राप्त करें सफलता प्राप्त करें: सर्वर से 127.0.0.1 जून 1151 से नमस्ते

लेकिन जब मैं आईपी को सार्वजनिक आईपी में बदलता हूं। ग्राहक सर्वर से प्रतिक्रिया नहीं प्राप्त कर सकते हैं। क्लाइंट फ़ंक्शन recvfrom पर बंद हो जाएगा।

कोई विचार?

मुझे लगता है - आप इसे मैक पर चला रहे हैं और फ़ायरवॉल चालू है? डिफ़ॉल्ट फ़िल्टरिंग नियम यूडीपी को बाहर भेजने और एक प्रतिक्रिया (ग्राहक) को भेजने की अनुमति देगा, लेकिन खुले सॉकेट (सर्वर) पर अवांछित डेटाग्राम प्राप्त करने की अनुमति नहीं देगा।

आपका कोड अन्यथा ठीक है, हालांकि आप जरूरी नहीं कि बाइंड (2) सॉकेट के क्लाइंट साइड की आवश्यकता हो। कर्नल स्रोत के लिए अगले उपलब्ध उच्च-संख्या वाला पोर्ट प्रदान करेगा। आप बदले में क्लाइंट पर कनेक्ट (2) कनेक्ट करने पर विचार कर सकते हैं, यदि आप ग्राहक और सर्वर के बीच किसी भी विस्तारित बातचीत की योजना बनाते हैं।

आप हमेशा चाहते हैं नेटवर्क से स्पष्ट रूप से शून्य-समाप्त स्ट्रिंग प्राप्त करने के लिए ऐसा न करने से अंतहीन दूरस्थ कारनामों का स्रोत रहा है।

Comments

Popular posts from this blog

Verilog Error: output or inout port "Q" must be connected to a structural net expression -

jasper reports - How to center align barcode using jasperreports and barcode4j -

c# - ASP.NET MVC - Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value -