Wednesday, 8 November 2017

विनसॉक भेजने डेटा बाइनरी विकल्प


पीएचपी सॉकेट प्रोग्रामिंग ट्यूटोरियल पीएचपी और टीसीपीआईपी सॉकेट पीएचपी में सॉकेट प्रोग्रामिंग सीखने के लिए यह एक त्वरित मार्गदर्शिका है। सॉकेट प्रोग्रामिंग php सी के समान है। अधिकांश फ़ंक्शन नाम, पैरामीटर और आउटपुट के समान हैं। हालांकि सी के विपरीत, पीएचपी में लिखे सॉकेट प्रोग्राम किसी भी ओएस पर चलेंगे जो कि php स्थापित है। इसलिए कोड को किसी भी प्लेटफ़ॉर्म विशिष्ट परिवर्तन की आवश्यकता नहीं है (अधिकतर)। मूल बातें संक्षेप करने के लिए, कुर्सियां ​​आपके कंप्यूटर द्वारा किए गए किसी भी प्रकार के नेटवर्क संचार के पीछे की बुनियादी चीजें हैं। उदाहरण के लिए जब आप अपने वेब ब्राउज़र में Google टाइप करते हैं, तो यह एक सॉकेट खोलता है और पेज को लाने के लिए Google से जोड़ता है और आपको इसे दिखाता है Gtalk या skype जैसे किसी भी चैट क्लाइंट के समान किसी भी नेटवर्क संचार एक सॉकेट के माध्यम से चला जाता है शुरू करने से पहले यह ट्यूटोरियल मानता है कि आप पहले से ही php जानते हैं और कमान lineterminal से php स्क्रिप्ट कैसे चलाना Php लिपियों को सामान्य रूप से अपार रूट डायरेक्टरी में उन्हें डालकर ब्राउज़र के अंदर से चलाया जाता है लेकिन ये कमांडलाइन प्रोग्राम किसी डायरेक्टरी से चलाए जा सकते हैं। वे ब्राउज़र से भी चल सकते हैं तो कुर्सियां ​​से शुरू होने दें सॉकेट बनाना यह पहली चीज है जो एक गर्तिका बना रही है। सॉकेटकेट फ़ंक्शन यह करता है यहां एक कोड नमूना है: फ़ंक्शन सॉकेट्रीकेट एक सॉकेट बनाता है और एक सॉकेट डिस्क्रिप्टर देता है जिसका उपयोग अन्य नेटवर्क कमांड में किया जा सकता है उपरोक्त कोड निम्नलिखित गुणों के साथ एक सॉकेट बनाएगा पता परिवार AFINET (यह आईपी संस्करण 4 है) प्रकार। सॉकास्ट्रीम (इसका मतलब है कि कनेक्शन उन्मुख टीसीपी प्रोटोकॉल) प्रोटोकॉल 0 या आईपीपीआरटीओआईपी यह आईपी प्रोटोकॉल है यदि कोई सॉकेट फ़ंक्शन विफल हो जाता है तो गलती जानकारी को सॉकेटलास्टरर और सॉकेटस्ट्रेरर फ़ंक्शंस का उपयोग कर लिया जा सकता है। ठीक। तो आपने सफलतापूर्वक एक सॉकेट बनाया है लेकिन आगे क्या होगा अगला हम इस सॉकेट का उपयोग करके कुछ सर्वर से कनेक्ट करने का प्रयास करेंगे। हम Google से कनेक्ट कर सकते हैं SOCKSTREAM प्रकार के सॉकेट्स के अलावा वहाँ एक और प्रकार है जिसे SOCKDGRAM कहा जाता है जो कि यूडीपी प्रोटोकॉल का संकेत देता है। इस प्रकार की सॉकेट गैर-कनेक्शन सॉकेट है इस ट्यूटोरियल में हम सॉकेस्ट्रीम या टीसीपी सॉकेट्स के साथ रहेंगे। किसी सर्वर से कनेक्ट करें हम एक निश्चित पोर्ट नंबर पर दूरस्थ सर्वर से कनेक्ट होते हैं। तो हमें 2 चीजों की ज़रूरत है आईपी ​​पता और पोर्ट नंबर से कनेक्ट करने के लिए तो आपको उस रिमोट सर्वर के आईपी पते को जानना होगा जिसे आप कनेक्ट कर रहे हैं। यहां हमने एक नमूना के रूप में Google का आईपी पता इस्तेमाल किया था। थोड़ी देर बाद हम देखेंगे कि किसी दिए गए डोमेन नाम का आईपी पता कैसे पता चलेगा। अंतिम चीज की जरूरत है कनेक्ट फ़ंक्शन। इसे कनेक्ट करने के लिए एक गर्तिका और एक सॉकाडार संरचना की आवश्यकता है यहाँ एक कोड नमूना है कार्यक्रम php varwwwsocket. php चलाएँ सॉकेट बनाया कनेक्शन की स्थापना यह एक सॉकेट बनाता है और फिर कनेक्ट करता है। पोर्ट 80 से अलग पोर्ट से कनेक्ट करने का प्रयास करें और आपको कनेक्ट करने में सक्षम नहीं होना चाहिए, जो इंगित करता है कि पोर्ट कनेक्शन के लिए खुला नहीं है। यह तर्क एक पोर्ट स्कैनर बनाने के लिए इस्तेमाल किया जा सकता है। ठीक है, इसलिए हम अब जुड़े हुए हैं चलो अगली बात करते हैं रिमोट सर्वर पर कुछ डेटा भेजना कनेक्शन की अवधारणा सॉकेट्स के SOCKSTREAMTCP प्रकार पर लागू होती है। कनेक्शन का मतलब है डेटा का एक विश्वसनीय प्रवाह है, इस तरह से कई ऐसी धाराएं हो सकती हैं जिनमें प्रत्येक का अपना संचार होता है इसके बारे में एक पाइप के रूप में सोचें जो अन्य डेटा द्वारा दखल नहीं करता है। अन्य कुर्सियां ​​जैसे यूडीपी ICMP। एआरपी कनेक्शन की एक अवधारणा नहीं है। ये गैर-कनेक्शन आधारित संचार हैं इसका अर्थ है कि आप किसी और से पैकेट भेजते या प्राप्त करते हैं। डाटा फंक्शन भेजने के लिए भेजा जायेगा डेटा भेजना होगा। इसे सॉकेट डिस्क्रिप्टर की आवश्यकता है भेजने और उसके आकार का डेटा यहाँ कुछ आईपी के लिए कुछ डेटा भेजने का एक बहुत सरल उदाहरण है: उपरोक्त उदाहरण में हम पहले एक आईपी पते से कनेक्ट करते हैं और फिर स्ट्रिंग संदेश को इसे HTTP1.1rnrn भेजें। संदेश वास्तव में एक वेबसाइट का मुख्य पृष्ठ लाने के लिए एक http आदेश है अब हम कुछ डेटा भेजते हैं। सर्वर से उत्तर प्राप्त करने का उसका समय तो ये करते है। सॉकेट में डेटा भेजते समय आप मूलतः उस सॉकेट में डेटा लिख ​​रहे हैं। यह फ़ाइल को डेटा लिखने के समान है इसलिए आप सॉकेट में डेटा भेजने के लिए लिखने के फ़ंक्शन का उपयोग भी कर सकते हैं। बाद में इस ट्यूटोरियल में हम डेटा भेजने के लिए लिखने के फ़ंक्शन का उपयोग करेंगे। डेटा फ़ंक्शन प्राप्त करना recv का उपयोग सॉकेट पर डेटा प्राप्त करने के लिए किया जाता है। निम्नलिखित उदाहरण में हम उसी संदेश को अंतिम उदाहरण के रूप में भेजेंगे और सर्वर से उत्तर प्राप्त करेंगे। यहां पर ऊपर दिए गए कोड का आउटलुक है: हम देख सकते हैं कि सर्वर द्वारा कौन से उत्तर भेजा गया था। यह एचटीएमएल जैसा दिखता है, ठीक है आईटी एचटीएमएल है Google ने हमारे द्वारा अनुरोधित पृष्ठ की सामग्री के साथ उत्तर दिया। काफी सरल अब हमें अपना जवाब मिला है, सॉकेट बंद करने का उसका समय। सॉकेट फ़ंक्शन सॉकेट क्लोज़ बंद करें सॉकेट बंद करने के लिए उपयोग किया जाता है। संशोधित करें तो उपरोक्त उदाहरण में हमने सीखा है कि: 1. एक गर्तिका बनाएं 2. रिमोट सर्वर से कनेक्ट करें 3. कुछ डेटा भेजें 4. उत्तर प्राप्त करें यह जानना उपयोगी है कि जब आप Google खोलते हैं, तो आपका वेब ब्राउज़र भी एक ही काम करता है इस तरह की गर्तिका गतिविधि एक ग्राहक का प्रतिनिधित्व करती है एक ग्राहक एक ऐसी प्रणाली है जो डेटा प्राप्त करने के लिए दूरस्थ सिस्टम से कनेक्ट होता है। अन्य प्रकार की सॉकेट गतिविधि को एक सर्वर कहा जाता है एक सर्वर एक ऐसा सिस्टम है जो आने वाले कनेक्शन प्राप्त करने के लिए सॉकेट्स का उपयोग करता है और उन्हें डेटा प्रदान करता है। यह क्लाइंट के विपरीत है तो Google एक सर्वर है और आपका वेब ब्राउज़र क्लाइंट है या अधिक तकनीकी रूप से Google एक HTTP सर्वर है और आपका वेब ब्राउज़र एक HTTP क्लाइंट है अब सॉकेट्स का उपयोग करते हुए कुछ सर्वर कार्य करने का समय है। लेकिन इससे पहले कि हम आगे बढ़ते हैं, कुछ साइड इफेक्ट होते हैं जिन्हें आपको कवर की जानी चाहिए। किसी होस्ट नाम का आईपी पता प्राप्त करें जब दूरस्थ होस्ट से कनेक्ट हो। इसके आईपी पता होना जरूरी है इस उद्देश्य के लिए समारोह gethostbyname का उपयोग किया जाता है यह पैरामीटर के रूप में डोमेन नाम लेता है और आईपी पता देता है। इसलिए उपरोक्त कोड का उपयोग किसी भी डोमेन नाम के आईपी पते को खोजने के लिए किया जा सकता है। फिर आईपी पते को एक सॉकेट का उपयोग करके कनेक्शन बनाने के लिए इस्तेमाल किया जा सकता है। सर्वर प्रोग्रामिंग अब सर्वर चीजों पर ठीक है सर्वर मूल रूप से निम्न करता है: 1. एक सॉकेट खोलें 2. किसी पते (और पोर्ट) से कनेक्ट करें। 3. आने वाले कनेक्शनों के लिए सुनो। 4. कनेक्शन स्वीकार करें 5. पढ़ें भेजें हम पहले से ही सॉकेट खोलने का तरीका सीख चुके हैं। तो अगले बात यह बाँध होगा। एक सॉकेट फंक्शन बाँध बाइंड करें एक सॉकेट को किसी विशेष पते और पोर्ट पर बाँध करने के लिए इस्तेमाल किया जा सकता है। इसे फ़ंक्शन से कनेक्ट करने के समान एक सॉकएड्रिन्विन संरचना की आवश्यकता होती है। अब यह बाँध किया जाता है, सॉकेट बनाने का समय कनेक्शन के लिए सुनता है। हम एक सॉकेट को एक विशेष आईपी पते और एक निश्चित पोर्ट संख्या से बाँधते हैं। ऐसा करने से हम यह सुनिश्चित करते हैं कि सभी आने वाले आंकड़े जो इस पोर्ट नंबर के लिए निर्देशित हैं, वे इस आवेदन से प्राप्त होते हैं। इससे यह स्पष्ट हो जाता है कि आपके पास एक ही बंदरगाह तक सीमित दो कुर्सियां ​​नहीं हो सकतीं। इस नियम के अपवाद हैं लेकिन हम उस किसी अन्य लेख में देखेंगे। कनेक्शन के लिए सुनो एक बंदरगाह के लिए एक सॉकेट बाइंडिंग के बाद अगली बात जो हमें करने की ज़रूरत है कनेक्शन के लिए सुनना है। इसके लिए हमें सॉकेट को सुन मोड में डालना होगा। सॉकेट लिस्ट में गर्तिका को चलाने के लिए फ़ंक्शन सॉकेटलिस्टन का उपयोग किया जाता है। बाँध के बाद बस निम्नलिखित पंक्ति को जोड़ें फ़ंक्शन सॉकेटलिस्ट के दूसरे पैरामीटर को बैकलॉग कहा जाता है यह इनकमिंग कनेक्शन की संख्या को नियंत्रित करता है जो कि प्रोग्राम पहले से ही व्यस्त है अगर प्रतीक्षा कर रहे हैं। इसलिए 10 निर्दिष्ट करके, इसका मतलब है कि अगर 10 कनेक्शन पहले से ही संसाधित होने की प्रतीक्षा कर रहे हैं, तो 11 वें कनेक्शन का अनुरोध अस्वीकार कर दिया जाएगा। यह सॉकेटैसेट की जांच के बाद अधिक स्पष्ट होगा। अब नए कनेक्शन स्वीकार करने का मुख्य भाग आता है। कनेक्शन स्वीकार करें फंक्शन सॉकेटैक्सेड इस के लिए उपयोग किया जाता है। कार्यक्रम को चलाएं। इसे php varwwwserver. php दिखाना चाहिए सॉकेट बनाया सॉकेट बाइंड ठीक सॉकेट सुनो ठीक है आने वाले कनेक्शन के लिए प्रतीक्षा कर रहा है। तो अब यह प्रोग्राम पोर्ट 5000 पर आने वाले कनेक्शनों की प्रतीक्षा कर रहा है। इस कार्यक्रम को बंद न करें। इसे चालू रखना अब एक ग्राहक इस पोर्ट पर इसे कनेक्ट कर सकता है। हम इस परीक्षण के लिए टेलनेट क्लाइंट का उपयोग करेंगे। एक टर्मिनल खोलें और टेलनेट लोकलहोस्ट टाइप करें 5000 यह तुरंत टेलनेट लोकलहोस्ट 5000 127.0.0.1 की कोशिश कर रहा है। स्थानीयहोस्ट से कनेक्ट किया गया बच चरित्र है कनेक्शन विदेशी मेजबान द्वारा बंद कर दिया गया है। और सर्वर आउटपुट क्लाइंट 127.0.0.1 दिखाएगा। 3668 9 अब हमारे साथ जुड़ा हुआ है तो हम देख सकते हैं कि क्लाइंट सर्वर से जुड़ा है। जब तक आप इसे सही काम नहीं करते तब तक ऊपर के चरणों को आज़माएं सॉकेटगेटपॉइंट नाम का उपयोग उस क्लाइंट के बारे में ब्योरा प्राप्त करने के लिए किया जाता है जो किसी विशेष सॉकेट के द्वारा सर्वर से जुड़ा हुआ है। हमने एक आने वाले कनेक्शन को स्वीकार कर लिया है लेकिन तुरंत इसे बंद कर दिया है। यह बहुत उत्पादक नहीं था कई चीजें हैं जो आने वाले कनेक्शन की स्थापना के बाद की जा सकती हैं। बाद में संचार के उद्देश्य के लिए कनेक्शन स्थापित किया गया था। तो ग्राहक को उत्तर देता है। समारोह socketwrite कुछ आने वाली कनेक्शन की गर्तिका में लिखने के लिए इस्तेमाल किया जा सकता है और क्लाइंट को इसे देखना चाहिए। यहां एक उदाहरण है: 1 टर्मिनल में ऊपर कोड चलाएं। और इस सर्वर से टेलनेट का उपयोग किसी दूसरे टर्मिनल से करें और आपको यह देखना चाहिए: इसलिए क्लाइंट (टेलनेट) को सर्वर से एक उत्तर प्राप्त हुआ। हम देख सकते हैं कि उसके तुरंत बाद कनेक्शन बंद हो गया है क्योंकि सर्वर स्वीकार करने और उत्तर भेजने के बाद समाप्त होता है। Google जैसे एक सर्वर आने वाले कनेक्शन स्वीकार करने के लिए हमेशा ऊपर रहता है। इसका अर्थ है कि सर्वर को हर समय चलना चाहिए। उसके बाद सेवा करने के लिए एक सर्वर का मतलब इसलिए हमें अपने सर्वर को गैर-स्टॉप चलाने के लिए रखना होगा। ऐसा करने का सबसे आसान तरीका है कि एक पाश में स्वीकार करना ताकि वह आने वाले कनेक्शन को हर समय प्राप्त कर सके। लाइव सर्वर तो एक लाइव सर्वर हमेशा जीवित रहेगा हमें इस कोड को आती है हम वहां बहुत कुछ कर चुके हैं। बस एक लूप में socketaccept डाल दिया अब 1 टर्मिनल में सर्वर प्रोग्राम चलाएं। और 3 अन्य टर्मिनल खोलें 3 टर्मिनल में से प्रत्येक में सर्वर पोर्ट के लिए एक टेलनेट होता है टेलनेट टर्मिनल में से प्रत्येक दिखाना होगा: टेलनेट स्थानीयहोस्ट 5000 127.0.0.1 की कोशिश कर रहा है स्थानीयहोस्ट से कनेक्ट किया गया बच चरित्र है खुश ठीक है विदेशी होस्ट द्वारा खुश कनेक्शन बंद। और सर्वर टर्मिनल php varwwwserver. php दिखाएगा सॉकेट बनाया सॉकेट बाइंड ठीक सॉकेट सुनो ठीक है आने वाले कनेक्शन के लिए प्रतीक्षा कर रहा है। क्लाइंट 127.0.0.1। 3711 9 अब हमारे साथ जुड़ा हुआ है। क्लाइंट 127.0.0.1। 37122 अब हमारे साथ जुड़ा हुआ है। क्लाइंट 127.0.0.1। 37123 अब हमारे साथ जुड़ा हुआ है। तो अब सर्वर नॉनस्टॉप चला रहा है और टेलनेट टर्मिनल भी नॉनस्टॉप से ​​जुड़े हैं। अब सर्वर प्रोग्राम बंद करें सभी टेलनेट टर्मिनल विदेशी होस्ट द्वारा कनेक्शन बंद कर देंगे। अच्छा रहा अब तक। लेकिन फिर भी वहाँ सर्वर और क्लाइंट के बीच प्रभावी संचार नहीं है। सर्वर प्रोग्राम कनेक्शन को एक पाश में स्वीकार करता है और सिर्फ उन्हें एक उत्तर भेजता है, उसके बाद यह उनके साथ कुछ भी नहीं करता है इसके अलावा यह एक समय में 1 से अधिक कनेक्शन को संभालने में सक्षम नहीं है। तो अब यह कनेक्शन को संभाल करने का समय है। और कई कनेक्शन एक साथ संभाल। हैंडलिंग कनेक्शन प्रत्येक कनेक्शन को संभालने के लिए हमें कनेक्शन को स्वीकार करने वाले मुख्य सर्वर के साथ चलाने के लिए एक अलग हैंडलिंग कोड की आवश्यकता होती है। इसे प्राप्त करने का एक तरीका थ्रेड्स का उपयोग कर रहा है। मुख्य सर्वर प्रोग्राम कनेक्शन को स्वीकार करता है और कनेक्शन के लिए संचार को संभालने के लिए एक नया धागा बनाता है, और फिर सर्वर अधिक कनेक्शन स्वीकार करने के लिए वापस चला जाता है। हालांकि php सीधे थ्रेडिंग का समर्थन नहीं करता है एक अन्य तरीका चयन फ़ंक्शन का उपयोग करना है। चयन समारोह मूलतः चुनाव या पर्यवेक्षक कुछ घटनाओं के लिए सॉकेट्स का एक सेट जैसे कि इसके पठनीय, या लिखने योग्य या कोई समस्या है या नहीं आदि। तो चयन समारोह का उपयोग कई ग्राहकों की निगरानी और जांच कर सकते हैं कि कौन सा ग्राहक संदेश भेजता है उपरोक्त सर्वर को चलाने और पहले की तरह 3 टर्मिनल खोलें। अब सर्वर प्रत्येक ग्राहक को जोड़ने के लिए एक थ्रेड बना देगा। टेलनेट टर्मिनल दिखेंगे: सर्वर टर्मिनल इस तरह दिख सकता है उपरोक्त कनेक्शन हैंडलर ग्राहक से कुछ इनपुट लेता है और उसी के साथ जवाब देता है। सरल यहां बताया गया है कि टेलनेट आउटपुट कैसा दिख सकता है, तो अब हमारे पास एक सर्वर है जो कि संवादात्मक है। Thats अब उपयोगी है निष्कर्ष अब तक आप php में सॉकेट प्रोग्रामिंग की मूल बातें सीख चुके होंगे। आप चैट क्लाइंट या कुछ समान लिखने जैसे कुछ प्रयोगों का प्रयास कर सकते हैं। अगर आपको लगता है कि ट्यूटोरियल को कुछ ऐडंस या सुधार या इसके बाद के किसी भी कोड स्निपेट की जरूरत नहीं है, तो नीचे टिप्पणी करने में संकोच न करें ताकि यह ठीक हो जाए। अंतिम बार अद्यतन किया गया। 26 मार्च 2018 यूडीपी प्रोटोकॉल (Winsock) के माध्यम से बाइनरी डाटा भेजने के लिए मैं एक क्लाइंट प्रोग्राम बना रहा हूँ जिसके लिए यूडीपी प्रोटोकॉल के माध्यम से सर्वर को बाइनरी डेटा भेजा जाना आवश्यक है। (आई विनसॉक नियंत्रण का उपयोग कर रहा है) Ive निम्नलिखित कोड का उपयोग कर रहा है। बिल्ट मंद एक्स के रूप में बाइट मंद एक्स के रूप में लांग डिम फाइल एक्स के रूप में इंटरर्जर विंसॉक 3। लोकलपोर्ट 10000 Winsock3.RemoteHost 211.233.70.51 Winsock3.RemotePort 9500 FileX फ्रीफ़ाइल ओपन App. Path udp1.dat Binary के लिए FileX X 1 Do X XLL के बाद (App. Path udp1.dat) 1 FileX प्राप्त करें एक्स, बायटेक्स Winsock3.SendData ByteX X X 1 लूप Close FileX जब मैं इस तरह से डेटा भेजता हूं, यह 52 बाइट्स युक्त 1 पैकेट के बजाय प्रत्येक 1 बाइट युक्त 52 पैकेट भेजता है। यह कोड टीसीपी प्रोटोकॉल के लिए ठीक से काम करता है, लेकिन यूडीपी समान काम नहीं करता है। मैं UDP प्रोटोकॉल का उपयोग करके बाइनरी डेटा कैसे भेज सकता हूं जो केवल 1 पैकेट डेटा भेजेगा मैं एक क्लाइंट प्रोग्राम बना रहा हूं जिसके लिए यूडीपी प्रोटोकॉल के माध्यम से सर्वर को बाइनरी डेटा भेजा जाना आवश्यक है। (आईआईएनएसक कंट्रोल का इस्तेमाल करते हुए):: मैं निम्नलिखित कोड का प्रयोग कर रहा हूं। :: डेम बायटेक्स बाइट के रूप में: मंद एक्स के रूप में लंबा: मंद फ़ाइल एक्स के रूप में:: Winsock3.लोकलपोर्ट 10000: Winsock3.RemoteHost 211.233.70.51: Winsock3.RemotePort 9500:: FileX फ्रीफ़ाइल: FileX के रूप में द्विआधारी के लिए खोलें App. Path udp1.dat : एक्स 1: एक्स फ़ाइल लैन तक (ऐप. पैथ udp1.dat) 1: फाइल X प्राप्त करें। एक्स, बायटेक्स: Winsock3.SendData ByteX: एक्स एक्स 1: लूप: बंद करें FileX:: जब मैं इस तरह से डेटा भेजता हूं, तो 52 बाइट्स युक्त 1 पैकेट के बजाय प्रत्येक 1 बाइट युक्त 52 पैकेट भेजता है। यह कोड टीसीपी प्रोटोकॉल के लिए ठीक से काम करता है, लेकिन यूडीपी समान काम नहीं करता है। मैं यूडीपी प्रोटोकॉल का उपयोग करके बाइनरी डेटा कैसे भेज सकता हूं जो केवल 1 पैकेट डेटा भेजता है: नमस्ते इस Winsock3 को प्रयास करें। प्रोटोकॉल sckUDPProtocol Winsock sckTCPProtocol डिफ़ॉल्ट रूप से है .. purpleDont जीवन को बहुत गंभीरता से ले लो, लेकिन आप इसे से जीवित नहीं बचते winsock Im माफ करना, क्या आप कह रहे हैं कि मुझे इस काम के लिए स्ट्रीम सॉकेट्स के बजाय डेटाग्राम का उपयोग करना है, मैं अभी सॉकेस्ट्रीम का उपयोग कर रहा हूं, और मैं इसके साथ रहना पसंद करूंगा। क्या यह अभी भी स्ट्रीम सॉकेट्स का उपयोग करते समय 0x00 को स्वीकार करने और इसके बाद डेटा को स्वीकार करने का कोई तरीका है। फिर, आपकी सभी सहायता के लिए धन्यवाद मिकी हम्म, अजीब बात है मैंने सोचा था कि SOCKDGRAM तर्क द्विआधारी डेटा निर्दिष्ट करना चाहिए, जैसा कि SOCKSTREAM के विपरीत है। : उस मामले में आरईसी को किसी भी शून्य से परे पढ़ना चाहिए। : क्या आप वाकई डेटा को किसी स्ट्रिंग-डेटाटाइप में कैप्चर नहीं कर रहे हैं, जो कि आप किसी फ़ाइल या कुछ स्ट्रट-रूटीन के साथ छपाई कर रहे हैं या लिख ​​रहे हैं: मेरा मतलब है, क्या आप सुनिश्चित हैं कि आप प्राप्त हुए डेटा को ठीक से प्रदर्शित कर रहे हैं मैं माफी चाहता हूं, क्या आप कह रहे हैं कि इस काम के लिए मुझे स्ट्रीम सॉकेट्स के स्थान पर डेटाग्राम का उपयोग करना है, मैं अभी सॉकेस्ट्रीम का उपयोग कर रहा हूं, और मैं इसके साथ रहना पसंद करूंगा। क्या यह अभी भी स्ट्रीम सॉकेट्स का उपयोग करते समय 0x00 को स्वीकार करने और इसके बाद डेटा को स्वीकार करने का कोई तरीका है। फिर, आपकी सभी सहायता के लिए धन्यवाद : मिकयू:। हम्म, यह अजीब है मैंने सोचा था कि SOCKDGRAM तर्क द्विआधारी डेटा निर्दिष्ट करना चाहिए, जैसा कि SOCKSTREAM के विपरीत है। । Recv उस मामले में किसी भी शून्य से परे पढ़ना चाहिए। । क्या आप वाकई डेटा को स्ट्रिंग-डेटाटाइप में कैप्चर नहीं कर रहे हैं, जो कि आप किसी फ़ाइल में लिख रहे हैं या किसी स्ट्रिप-रूटीन के साथ कुछ लिख रहे हैं मेरा मतलब है, क्या आप सुनिश्चित हैं कि आप प्राप्त हुए आंकड़ों को ठीक से प्रदर्शित कर रहे हैं: सॉकेटडीआरएम का मतलब बाइनरी डेटा नहीं है। इसका अर्थ है कि आप आंकड़ों को भेजने के लिए यूडीपी प्रोटोकॉल का उपयोग करना चाहते हैं और डाटा आंकड़ों में भेजा जाता है। सॉक्सस्ट्रीम का अर्थ है कि आप टीसीपी प्रोटोकॉल का उपयोग करना चाहते हैं और डेटा को स्ट्रीम के रूप में भेजना चाहते हैं। सॉकेट क्या आप किस प्रकार का डेटा भेज रहे हैं परवाह नहीं करता है आपको केवल बफर के लिए पॉइंटर की जरूरत है, जो उस बफर के डेटा और लंबाई को रखता है। डेटा के अंदर शून्य कुछ भी नहीं है, इसका सिर्फ शून्य डेटा सी-स्ट्रिंग्स के रूप में शून्य से समाप्त नहीं होता है। सॉकेट डेटा की सामग्री के बारे में ध्यान नहीं देता मुझे लगता है कि आपके पास कोड प्राप्त होने में कुछ गड़बड़ है। शायद आप टर्मिनेटर के रूप में शून्य का उपयोग कर रहे हैं, जो बहुत बुरी बात है यदि आप कोड प्राप्त कर सकते हैं जो डेटा को यहां प्राप्त करता है तो मैं इसके बारे में गलत पता लगाने की कोशिश कर सकता हूं। यहाँ कोड है जो मैं उपयोग कर रहा हूँ दोबारा, मैं विंसॉक में नया हूँ इसलिए कृपया मेरे साथ खड़े रहें। धन्यवाद कोड इंट सर्वर (रिक्त) अहस्ताक्षरित चार रीमेक्स ग्रा 3072 सॉकेट सर्वरफ़्ड, क्लाइंटफ़्ड सॉकेटफर्ड पर सुनो, नए एफडी पर नया कनेक्शन सॉकेट एड्रॉडर सर्वर SOCKADDRIN क्लाइंटएंडआरएएनएएनएएनआईएसएक्सएएसएमएस्सेटआर्ड 0 चार सवाल WSADATA wsadata अहस्ताक्षरित लघु वर्चुअलाइजेशन फ़ाइल माइक लिंगेर लिंगवेर वर्कक्वेस्ट मैकवर्ड (2,2 ) () () (), (सर्वर सॉकेट (एफ़आईएएनईटी, सोक्स्टाम, 0)) 1) झूठ (सर्वर साइड: सॉकेट नहीं खोल सकता है) अगर (WSAStartup (verrequest, ampwsadata) -1) प्रिंटफ़ (एक उपयोगी Winsock DLL नहीं मिल सकता है) बाहर निकलें (1) LingVar. lonoff TRUE LingVar. llring 0 यदि (सेटोकोपेट (सर्वरफोर्ड, सॉल्स्क्केट, सोओबिनलाइन, (चार एफएआर) ampLingVar, साइकोफ (लिंगविर)) -1) झूठ (सर्वर साइड: सेटोकॉप) प्रदर्शन से बाहर निकलें (1) serveraddr. sinfamily AFINET serveraddr । () () (बाँध (सर्वरफ़्ड, एम्पस्पेरवार्डेर, आकार (सर्वरएडीआर)) -1) झिल्ली (सर्वर) साइड: बंदरगाह नहीं बांध सकते हैं) बाहर निकलें (1) अगर (सुनो (serverfd, PACKETQUEUE) -1) प्रति आरओआर (सर्वर साइड: गर्तिका को नहीं सुन सकता) बाहर निकलें (1) मेमेटसेट (रीम्सजी, 0x0, 3072), जबकि (1) प्रिंटफ़ (क्या आप जारी रखना चाहते हैं (YN)) सवाल पाने वाला () अगर (सवाल) का प्रश्न getchar () अगर (प्रश्न एन प्रश्न n) रिटर्न 0 प्रिंटफ़ (सर्वर साइड: बंदरगाह पर डेटा के लिए प्रतीक्षारत) लेन आकार (clientaddr) clientfd स्वीकार (serverfd, (struct sockaddr) ampclientaddr, बढ़ाना) अगर (clientfd-1) प्रति (सर्वर साइड: स्वीकार नहीं कर सकता कनेक्शन) वापसी त्रुटि (सर्वर साइड: से प्राप्त कनेक्शन: एस, inetntoa (clientaddr. sinaddr)) msgsize रीडलाइन (recmsg, clientfd, clientaddr) अगर (त्रुटि संदेश की अनुमति देता है) printf (सर्वर साइड: संदेश पढ़ा नहीं जा सका) coutltltthis संदेश आकार है : (WSACleanup () -1) झुंझल (WSACLEANUP के साथ समस्या) से बाहर निकलने के लिए: एलटीएलटीएमएसजीज़ेलल्टेंडल एफआरआइट (रिम्स ग्रा, साइकोफ (लघु पूर्णांक), 10, माइक) (जे0 जेएलटी 10 जे) के लिए प्रिंटफ़ (- सी, रिकमेजीज) क्लॉनेसकेट (क्लाइंटफ़्डी) 1) इंट रीडलाइन (अहस्ताक्षरित चार बफ़, सॉकेट एसडी, सोकैडड्रिन क्लाएंट एड) चार सेग्माएक्सडीएटीए इंट ऑफसेट 0 इंट रेस 1 इंट क्लायलीन मेमेसेट (सेग, 0x0, मैक्सडाटा) क्लिएल (आकार, सेग, मैक्सडाटा, 0, (ढाका) ampclientaddr, ampcliLen) SOCKETERROR अगर (resEOFresWSAECONNRESETresWSAECONNABORTED) 0 अन्य पक्ष समाप्त conn printf (क्लाइंट समाप्त कनेक्शन) ऑफसेट memcpy वापसी (bufoffset, सेग, रिज़) ऑफ़सेट रेस मेम्सेट (सेग, 0x0, मैक्सडाटा) रिटर्न एरर कोड: एसओसीकेडीआरएएम का मतलब बाइनरी डेटा नहीं है इसका अर्थ है कि आप आंकड़ों को भेजने के लिए यूडीपी प्रोटोकॉल का उपयोग करना चाहते हैं और डाटा आंकड़ों में भेजा जाता है। सॉक्सस्ट्रीम का अर्थ है कि आप टीसीपी प्रोटोकॉल का उपयोग करना चाहते हैं और डेटा को स्ट्रीम के रूप में भेजना चाहते हैं। :: सॉकेट क्या आप किस प्रकार के डेटा भेज रहे हैं परवाह नहीं करता है। आपको केवल बफर के लिए पॉइंटर की जरूरत है, जो उस बफर के डेटा और लंबाई को रखता है। :: शून्य के अंदर डेटा कुछ भी मतलब नहीं है, इसका सिर्फ शून्य डेटा सी-स्ट्रिंग्स के रूप में शून्य से समाप्त नहीं होता है। सॉकेट डेटा की सामग्री के बारे में ध्यान नहीं देता :: मुझे लगता है कि आपके पास कोड प्राप्त होने में कुछ गड़बड़ है। शायद आप टर्मिनेटर के रूप में शून्य का उपयोग कर रहे हैं, जो बहुत बुरी बात है यदि आप कोड प्राप्त कर सकते हैं जो डेटा को यहां प्राप्त करता है तो मैं इसके बारे में गलत पता लगाने की कोशिश कर सकता हूं। : सी के साथ विंडोज़ सॉकेट प्रोग्रामिंग के लिए एक परिचय हमारे पास इस अध्याय 1 भाग 4 में डेटा ट्रांसमिशन प्रेषण () और WSASend () WSASendDisconnect () आउट-ऑफ-बैंड डेटा recv () और WSARecv () WSARecvDisconnect () स्ट्रीम प्रोटोकॉल स्कैटर - इथर आईओ कनेक्शन को बंद करना बंद करें () बंद करने वाला () टीसीपी रिसीवर सर्वर चुनें () उदाहरण डेटा ट्रांसमिशन भेजें () और WSASend () WSASendDisconnect () आउट-ऑफ-बैंड डेटा recv () और WSARecv () प्राप्त अनुरोध केवल पूरा होगा जब निम्नलिखित घटनाओं में से एक होता है: कॉलर द्वारा बफर प्रदान की गई पूरी तरह पूर्ण है। कनेक्शन बंद कर दिया गया है अनुरोध रद्द कर दिया गया है या कोई त्रुटि हुई है। ध्यान दें कि यदि अंतर्निहित परिवहन MSGWAITALL का समर्थन नहीं करता है, या यदि सॉकेट गैर-अवरोधन मोड में है, तो यह कॉल WSAEOPNOTSUPP के साथ विफल हो जाएगी। इसके अलावा, यदि MSGWAITALL को MSGOOB, MSGPEEK, या MSGPARTIAL के साथ निर्दिष्ट किया गया है, तो यह कॉल WSAEOPNOTSUPP के साथ विफल हो जाएगा यह फ्लैग डेटाग्राम सॉकेट या संदेश-उन्मुख सीओ सॉकेट्स पर समर्थित नहीं है। बेशक, 0 कोई विशेष कार्रवाई नहीं निर्दिष्ट करता है MSGPEEK डेटा प्राप्त करता है जो आपूर्ति प्राप्त बफ़र में प्रतिलिपि करने के लिए उपलब्ध है। लेकिन यह डेटा सिस्टम बफ़र से निकाला नहीं गया है लंबित बाइट्स की संख्या भी लौटा दी गई है संदेश देखना बुरा है न केवल प्रदर्शन को नीचा दिखाता है, क्योंकि अब आपको दो सिस्टम कॉल करने की आवश्यकता है (एक को देखने के लिए और किसी को एमएसजीपीईईके फ्लैग के बिना डेटा को वास्तव में निकाला जा सकता है), लेकिन कुछ परिस्थितियों में यह अविश्वसनीय भी है। दिया गया डेटा उपलब्ध संपूर्ण राशि को प्रतिबिंबित नहीं करेगा साथ ही, सिस्टम बफ़र्स में डेटा को छोड़कर, सिस्टम में आने वाली डेटा को शामिल करने के लिए कम स्थान है। नतीजतन, सिस्टम सभी प्रेषकों के लिए टीसीपी विंडो आकार कम कर देता है। यह आपके एप्लिकेशन को अधिकतम संभावित थ्रूपुट को प्राप्त करने से रोकता है। सबसे अच्छी बात यह है कि आप अपने खुद के बफ़र में सभी डेटा कॉपी कर सकते हैं और इसे वहां हेरफेर कर सकते हैं। एक संदेश - या डेटाग्राम-आधारित सॉकेट जैसे यूडीपी पर आरईवी () का उपयोग करते समय कुछ विचार हैं, जिसे हम बाद में बताएंगे। यदि लंबित डेटा आपूर्ति बफ़र से बड़ा होता है, तो बफ़र उतना अधिक डेटा से भर जाता है जितना इसमें होगा। इस घटना में, recv () कॉल WSAEMSGSIZE त्रुटि उत्पन्न करता है। ध्यान दें कि संदेश-आकार त्रुटि संदेश-उन्मुख प्रोटोकॉल के साथ होती है। स्ट्रीम प्रोटोकॉल जैसे कि टीसीपी बफर इनकमिंग डेटा और आवेदन अनुरोध के रूप में ज्यादा डेटा लौटाएगा, भले ही लंबित डेटा की मात्रा अधिक हो। इस प्रकार, स्ट्रीमिंग प्रोटोकॉल के लिए आप WSAEMSGSIZE त्रुटि का सामना नहीं करेंगे। WSARecv () फ़ंक्शन, recv () पर कुछ नई क्षमताओं को जोड़ता है, जैसे ओवरलैप IO और आंशिक डेटाग्राम सूचनाएं WSARecv की परिभाषा () है: पैरामीटर एस जुड़ा सॉकेट है दूसरे और तीसरे पैरामीटर डेटा प्राप्त करने के लिए बफ़र्स हैं। LPBuffers पैरामीटर WSABUF संरचनाओं की एक सरणी है, और dwBufferCount सरणी में WSABUF संरचनाओं की संख्या को इंगित करता है। LpNumberOfBytesReceived पैरामीटर इस कॉल के द्वारा प्राप्त बाइट्स की संख्या को इंगित करता है यदि प्राप्त प्रचालन तुरंत पूरा हो जाता है। LpFlags पैरामीटर मूल्यों में से एक हो सकता है MSGPEEK, MSGOOB, या MSGPARTIAL, या बिटवर्ड या उन मानों के संयोजन। MSGPARTIAL ध्वज के कई अलग-अलग अर्थ हैं, जहां यह उपयोग किया जाता है या उसका सामना करते हैं। संदेश उन्मुख प्रोटोकॉल जो आंशिक मैसेजिंग (जैसे एप्पलटॉक) का समर्थन करते हैं, के लिए, इस ध्वज को WSARecv () से वापसी पर सेट किया गया है (यदि संपूर्ण संदेश अपर्याप्त बफर स्थान के कारण इस कॉल में नहीं लौटाया जा सकता है)। इस मामले में, बाद में WSARecv () कॉल्स इस ध्वज को सेट करते हैं जब तक पूरे संदेश वापस नहीं किया जाता है, जब MSGPARTIAL ध्वज साफ़ हो जाता है। यदि यह फ़्लैग किसी इनपुट पैरामीटर के रूप में पारित किया गया है, तो डेटा उपलब्ध होने पर प्राप्त कार्रवाई को पूरा करना चाहिए, भले ही वह संपूर्ण संदेश का केवल एक हिस्सा हो। MSGPARTIAL ध्वज को संदेश-उन्मुख प्रोटोकॉल के साथ ही प्रयोग किया जाता है, स्ट्रीमिंग वाले के साथ नहीं। इसके अलावा, सभी प्रोटोकॉल आंशिक संदेशों का समर्थन नहीं करते हैं। प्रत्येक प्रोटोकॉल के लिए प्रोटोकॉल प्रविष्टि में एक झंडा है, जो यह इंगित करता है कि यह इस सुविधा का समर्थन करता है या नहीं। अन्य अध्याय में चर्चा की गई ओवरलैप आईओ ऑपरेशन में एलपी ओवरलाप्प्ड और एलपी कॉम्प्लेप्शनराइनिन मापदंडों का उपयोग किया जाता है। एक अन्य विशिष्ट प्राप्त कार्य आपको अवगत होना चाहिए: WSARecvDisconnect () WSARecvDisconnect () यह फ़ंक्शन WSASendDisconnect () के विपरीत है और इसे निम्नानुसार परिभाषित किया गया है: int WSARecvDisconnect (SOCKET s, LPWSABUF lpInboundDisconnectData) इसके भेजने समकक्ष की तरह, WSASendDisconnect () के पैरामीटर जुड़े सॉकेट हैंडल और एक वैध WSABUF संरचना है डेटा प्राप्त करना प्राप्त आंकड़े केवल उस डेटा को डिस्कनेक्ट कर सकते हैं जो किसी दूसरी ओर WSASendDisconnect () द्वारा भेजा जाता है जिसे सामान्य डेटा प्राप्त करने के लिए उपयोग नहीं किया जा सकता। इसके अतिरिक्त, एक बार डेटा प्राप्त होने पर, यह फ़ंक्शन रिमोट पार्टी से रिसेप्शन को अक्षम करता है, जो बंद करने के लिए समान है () फ़ंक्शन (जो बाद में वर्णित है) SDRECEIVE के साथ स्ट्रीम प्रोटोकॉल क्योंकि अधिकांश कनेक्शन-उन्मुख संचार, जैसे कि टीसीपी, स्ट्रीमिंग प्रोटोकॉल है, अच्छी तरह से उन्हें यहाँ संक्षिप्त रूप से वर्णन करते हैं एक स्ट्रीमिंग प्रोटोकॉल यह है कि प्रेषक और रिसीवर डेटा को छोटे या बड़े समूहों में विभाजित या एकत्र कर सकते हैं। निम्नलिखित चित्र का वर्णन क्लाइंट और सर्वर पक्षों के बीच टीसीपी पैकेट के प्रवाह का संक्षेप में वर्णन करता है। स्ट्रीम सॉकेट पर डेटा भेजने या प्राप्त करने वाले किसी भी कार्य के बारे में जागरूक होने की मुख्य बात यह है कि आप जिस अनुरोध पर डेटा की मात्रा को पढ़ने या लिखने की गारंटी नहीं देते हैं कहें कि आपके पास 2048 बाइट्स के साथ एक कैरेक्टर बफर है जिसे आप भेज फ़ंक्शन के साथ भेजना चाहते हैं। यह भेजने के लिए कोड है: int nBytes 2048 डेटा के 2048 बाइट के साथ प्रेषण बफर भरें मान लें कि एक मान्य, कनेक्ट की गई स्ट्रीम सॉकेट रिसेट भेजें (एस, भेजेंबफ, एनबीइट्स, 0) संभव है कि 2048 बाइट्स । रिट वेरिएबल को भेजे गए बाइट्स की संख्या पर सेट किया जाएगा क्योंकि सिस्टम प्रत्येक सॉकेट के लिए डेटा को भेजने और प्राप्त करने के लिए निश्चित बफर स्थान को आवंटित करता है। डेटा भेजने के मामले में, आंतरिक बफ़र्स डेटा को ऐसे समय तक भेजते हैं, जब तक कि तार तार पर डेटा नहीं रख सकते। कई सामान्य स्थितियों के कारण यह हो सकता है उदाहरण के लिए, बस एक बड़ी मात्रा में डेटा संचारित करने से ये बफ़र्स जल्दी से भर जाएंगे इसके अलावा, टीसीपीआईपी के लिए, खिड़की के आकार के रूप में जाना जाता है (खिड़की डेमो स्लाइडिंग)। प्राप्त अंत यह विंडो आकार समायोजित करेगा कि यह कितना डेटा प्राप्त कर सकता है। यदि रिसीवर डेटा के साथ बाढ़ आ रहा है, तो यह लंबित डेटा के साथ पकड़ने के लिए विंडो आकार को 0 पर सेट कर सकता है। इससे प्रेषक को तब तक रोकना होगा जब तक कि इसे 0 से अधिक नया विंडो आकार प्राप्त न हो जाए। हमारे भेजने के मामले में, केवल 1024 बाइट्स को पकड़ने के लिए बफर स्थान हो सकता है, इस स्थिति में आपको शेष 1024 बाइट्स को फिर से जमा करना होगा। निम्नलिखित कोड यह सुनिश्चित करता है कि आपके सभी बाइट भेजे जाते हैं: इंट nBytes 2048, nLeft, idx डेटा के 2048 बाइट के साथ Sendbuff भरें, जबकि (nLeft gt 0) मान लें एक मान्य, कनेक्टेड स्ट्रीम सॉकेट है हालात थोड़ा जटिल हो जाते हैं यदि आपका संदेश आकार भिन्न हो । अपने खुद के प्रोटोकॉल को लागू करने के लिए रिसीवर को पता है कि आगामी संदेश कितना बड़ा होगा यह आवश्यक है। उदाहरण के लिए, रिसीवर को लिखे गए पहले चार बाइट्स हमेशा आगामी संदेश के बाइट्स में पूर्णांक आकार होंगे। रिसीवर पहले चार बाइट्स को देखकर, उन्हें पूर्णांक में कनवर्ट करके और संदेश में शामिल किए गए कितने अतिरिक्त बाइट्स को निर्धारित करते हुए हर पठन शुरू करेंगे। तितर बितर-इकट्ठा IO स्कैटर-इकट्ठा समर्थन एक अवधारणा है जो मूल रूप से बर्कले सॉकेट्स में आरम्भ और पुनः लेखन के कार्य के साथ प्रस्तुत की गई थी। यह सुविधा Winsock 2 फ़ंक्शन WSARecv (), WSARecvFrom (), WSASend (), और WSASendTo () के साथ उपलब्ध है। यह उन अनुप्रयोगों के लिए सबसे उपयोगी होता है जो बहुत विशिष्ट तरीके से प्रारूपित डेटा भेजते और प्राप्त करते हैं। उदाहरण के लिए, किसी क्लाइंट से सर्वर पर संदेश हमेशा एक निश्चित 32-बाइट हेडर से बना हो सकता है जो कुछ ऑपरेशन निर्दिष्ट करता है, इसके बाद 64-बाइट डेटा ब्लॉक और 16-बाइट ट्रेलर के साथ समाप्त होता है। इस उदाहरण में, WSASend () को तीन WSABUF संरचनाओं की एक सरणी के साथ कहा जा सकता है, प्रत्येक तीन संदेश प्रकारों से संबंधित है। प्राप्त करने के अंत में, WSARecv () को तीन WSABUF संरचनाओं के साथ बुलाया जाता है, प्रत्येक में 32 बाइट्स, 64 बाइट्स और 16 बाइट्स वाले डेटा बफ़र्स होते हैं। स्ट्रीम-आधारित सॉकेट्स का उपयोग करते समय, बिखराव-इकट्ठा आपरेशन बस डब्लूएसएबीयूएफ संरचनाओं में दिए गए डेटा बफ़र्स का एक समान बफर के रूप में व्यवहार करते हैं। साथ ही, सभी बफ़र्स पूर्ण होने से पहले कॉल प्राप्त हो सकता है। संदेश-आधारित सॉकेट पर, प्रत्येक प्राप्त कॉल को प्राप्त किए गए बफ़र आकार तक एक एकल संदेश प्राप्त होता है। यदि बफर स्थान अपर्याप्त है, तो कॉल WSAEMSGSIZE के साथ विफल हो जाती है और उपलब्ध अंतरिक्ष में फिट होने के लिए डेटा काट दिया जाता है। बेशक, आंशिक संदेशों का समर्थन करने वाले प्रोटोकॉल के साथ, डेटा हानि को रोकने के लिए MSGPARTIAL ध्वज का उपयोग किया जा सकता है। कनेक्शन को तोड़ना एक सॉकेट कनेक्शन के साथ समाप्त हो जाने के बाद, आपको इसे बंद करना होगा और उस सॉकेट हैंडल से संबंधित कोई भी संसाधन जारी करना होगा। खुले सॉकेट हैंडल के साथ जुड़े संसाधनों को वास्तव में रिलीज़ करने के लिए, बंद करने वाले () कॉल का उपयोग करें जागरूक रहें, हालाँकि, उस बंदरगाह () के कुछ प्रतिकूल प्रभाव हो सकते हैं, यह कैसे कहा जाता है के आधार पर, जिससे डेटा हानि हो सकती है। इस कारण से, बंद करने वाले () फ़ंक्शन पर कॉल करने से पहले एक कनेक्शन को शटडाउन () फ़ंक्शन के साथ पूर्णतः बंद कर दिया जाना चाहिए। इन दो एपीआई कार्यों पर चर्चा की जाती है। शटडाउन () यह सुनिश्चित करने के लिए कि सभी डेटा जो एक आवेदन भेजता है, पीयर द्वारा प्राप्त किया जाता है, एक अच्छी तरह से लिखित एप्लिकेशन को रिसीवर को सूचित करना चाहिए कि कोई और डेटा भेजने के लिए नहीं है। इसी तरह, सहकर्मी को भी ऐसा करना चाहिए। इसे एक सुंदर क्लोज़ के रूप में जाना जाता है और शटडाउन () फ़ंक्शन द्वारा किया जाता है, जिसे परिभाषित किया गया है: इंट बंद (सॉकेट, एएनटी कैसे) कैसे पैरामीटर SDRECEIVE, SDSEND, या SDBOTH हो सकता है SDRECEIVE के लिए, सॉकेट पर किसी भी प्राप्त समारोह के बाद के कॉल को अनुमति नहीं है। निम्न प्रोटोकॉल परतों पर इसका कोई प्रभाव नहीं है I और टीसीपी सॉकेट्स के लिए, यदि डेटा प्राप्त करने के लिए कतारबद्ध है या डेटा बाद में आता है, तो कनेक्शन रीसेट है। हालांकि, यूडीपी सॉकेट्स पर इनकमिंग डेटा अभी भी स्वीकार किए जाते हैं और कतारबद्ध होते हैं (क्योंकि शट डाउन () का कनेक्शन रहित प्रोटोकॉल का कोई मतलब नहीं है)। SDSEND के लिए, किसी भी भेजें फ़ंक्शन के लिए आने वाली कॉल को अनुमति नहीं दी जाती है। टीसीपी सॉकेट्स के लिए, यह सभी डेटा भेजे जाने और प्राप्तकर्ता द्वारा स्वीकार किए जाने के बाद एक एफआईएन पैकेट उत्पन्न करने का कारण बनता है। अंत में, SDBOTH निर्दिष्ट करने से अक्षम दोनों को भेजता है और प्राप्त करता है नोट करें कि सभी कनेक्शन-उन्मुख प्रोटोकॉल सुंदर बंद होने का समर्थन नहीं करते, जो कि शटडाउन () एपीआई करता है। इन प्रोटोकॉल (जैसे कि एटीएम) के लिए, सत्र को समाप्त करने के लिए केवल कॉलसॉसेट () को बुलाया जाना चाहिए। एक ध्वज जो वर्णन करता है कि किस प्रकार का ऑपरेशन निम्न तालिका में सारांशित है इस फ्लैग के संभावित मूल्यों को Winsock2.h हेडर फाइल में सूचीबद्ध किया गया है। शटडाउन () फ़ंक्शन को भेजने, प्राप्त करने या दोनों को अक्षम करने के लिए कहा जाने के बाद, वर्तमान सॉकेट कनेक्शन के लिए भेजने या प्राप्त करने के लिए पुन: सक्षम करने का कोई तरीका नहीं है। किसी एप्लिकेशन को बंद होने के बाद सॉकेट को पुन: उपयोग करने में सक्षम होने पर भरोसा नहीं करना चाहिए। विशेष रूप से, एक सॉकेट जो कि शट डाउन है, पर कनेक्ट () के उपयोग के समर्थन के लिए एक Windows सॉकेट प्रदाता की आवश्यकता नहीं है। यदि कोई अनुप्रयोग गर्तिका का पुन: उपयोग करना चाहता है, तो डिस्कनेक्टएक्स () फ़ंक्शन को dwFlags पैरामीटर सेट के साथ TFREUSESKKET पर कॉल किया जाना चाहिए ताकि किसी सॉकेट पर कनेक्शन बंद हो और फिर से उपयोग करने के लिए सॉकेट हैंडल तैयार कर सकें। जब DisconnectEx () अनुरोध पूरा हो जाता है, तो सॉकेट हैंडल AcceptEx () या ConnectEx () फ़ंक्शन पर जा सकता है। यदि कोई एप्लिकेशन सॉकेट का पुन: उपयोग करना चाहता है, तो ट्रांसमिटफ़ाइल () या ट्रांस्मिटपैकेट () फ़ंक्शन को डीफफ्लैग पैरामीटर सेट के साथ TFDISCONNECT और TFREUSESKKET के साथ बुलाया जा सकता है ताकि सभी डेटा ट्रांसमिशन के लिए कतारबद्ध हो और पुन: उपयोग किए जाने वाले सॉकेट हैंडल तैयार करें। जब ट्रांसमिटफ़ाइल () अनुरोध पूरा हो जाता है, तो सॉकेट हैंडल को कनेक्शन को स्थापित करने के लिए पहले उपयोग किए जाने वाले फ़ंक्शन कॉल को पारित किया जा सकता है, जैसे AcceptEx () या ConnectEx ()। When the TransmitPackets() function completes, the socket handle can be passed to the AcceptEx() function. Take note that the socket level disconnect is subject to the behavior of the underlying transport. For example, a TCP socket may be subject to the TCP TIMEWAIT state, causing the DisconnectEx(), TransmitFile(), or TransmitPackets() call to be delayed. closesocket() The closesocket() function closes a socket and is defined as: int closesocket (SOCKET s) If no error occurs, closesocket() returns zero. Otherwise, a value of SOCKETERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError(). The socket is marked as nonblocking, but the lonoff member of the linger structure is set to non-zero and the llinger member of the linger structure is set to a nonzero timeout value. Calling closesocket() releases the socket descriptor and any further calls using the socket fail with WSAENOTSOCK. If there are no other references to this socket, all resources associated with the descriptor are released. This includes discarding any queued data. Pending synchronous calls issued by any thread in this process are canceled without posting any notification messages. Pending overlapped operations are also canceled. Any event, completion routine, or completion port that is associated with the overlapped operation is performed but will fail with the error WSAOPERATIONABORTED. In addition, one other factor influences the behavior of closesocket(): whether the socket option SOLINGER has been set. An application should always have a matching call to closesocket() for each successful call to socket to return any socket resources to the system. TCP ReceiverServer With select() Example 1. While in the Visual C IDE, click File menu gt Project sub menu to create a new project. 2. Select Win32 for the Project types: and Win32 Console Application for the Templates. Put the project and solution name. Adjust the project location if needed and click OK. 3. Click Next for the Win32 Application Wizard Overview page. We will remove all the unnecessary project items. 4. In the Application page, select Empty project for the Additional options. Leave others as given and click Finish. 5. Next, we need to add new source file. Click Project menu gt Add New Item sub menu or select the project folder in the Solution Explorer gt Select Add menu gt Select New Item sub menu. 6. Select C File (.cpp) for the Templates. Put the source file name and click Add. Although the extension is. cpp, Visual C IDE will recognize that the source code used is C based on the Compile as C Code (TC) option which will be set in the project property page later. 7. Now, add the source code as given below. A sample of the select() return value int recvTimeOutTCP(SOCKET socket, long sec, long usec)

No comments:

Post a Comment