अध्यक्ष: अब चलो गोता वितरण कोड में
और संदर्भ पर एक नज़र रखना जिसमें कोड तुम लिखो
संचालन किया जा रहा है।
दिन के अंत में, आप को लागू करने के लिए जा रहे हैं
वेब सर्वर की सम्पूर्णता।
लेकिन हम प्रदान की है कंकाल के साथ आप
कुछ कार्यक्षमता है कि कोड, विशेष रूप से नेटवर्किंग से संबंधित है।
चलो एक नज़र रखना।
>> यहाँ शीर्ष की ओर तो फ़ाइल का एक गुच्छा है
सुविधा की मैक्रो आवश्यकताओं का परीक्षण करें।
अब इस सी, जिससे की सिर्फ एक विशेषता यह है मैन पेज का एक गुच्छा के अनुसार
आप में से कुछ को परिभाषित किया है इन स्थिरांक सच करने के लिए
या तो यह है कि यहां तक ​​कि विशिष्ट संख्या होने के लिए आप कुछ कार्यों के लिए उपयोग किया है।
अन्यथा वे अघोषित हो जाएगा और आप उपयोग नहीं होगा।
तो मैं जिस तरह से यह किया है मैन ऑफ द पृष्ठों को पढ़ने।
अब नीचे में 17 लाइनों के माध्यम से 15, हम
घोषित सीमा की एक पूरी गुच्छा है।
>> और हम एक से इन उधार लिया है अपाचे बुलाया लोकप्रिय वेब सर्वर।
और इन बस रहे हैं जा रहे हैं कि संख्या
कुल संख्या टोपी बाइट्स की कि अनुमति दी जाती है
HTTP अनुरोध के लिए विभिन्न संदर्भों में एक ब्राउज़र है कि मुझे भेजने के लिए अनुमति दी है।
अगला, हम ओकटेट परिभाषित करते हैं।
अब एक ओकटेट सिर्फ एक अच्छा तरीका है एक बाइट, या आठ बिट कहने का।
पुराने एक बाइट में बदल जाता है जरूरी नहीं कि आठ बिट था,
इसलिए ओकटेट हमेशा आठ बिट है।
इसलिए इस मामले में हम अपनाया है क्या नेटवर्किंग में आम है
आठ बाइट्स एक ओकटेट बुलाने की दुनिया।
>> यहाँ मैं ओकटेट होगा कि निर्दिष्ट किया है इतना है कि ज्यादा फोरेंसिक में की तरह, 512 हो
हम में से एक गुच्छा जब पढ़ें एक समय में बाइट्स, यहां भी
हम एक को पढ़ने के लिए जा रहे हैं एक समय में ओकटेट का गुच्छा।
हेडर फाइल की एक पूरी गुच्छा अगले।
मैं कैसे इन में शामिल करने के लिए जानते हैं?
वैसे मैं बस आदमी पढ़ा कार्यों का एक नंबर के लिए पृष्ठों
हम इस वितरण में इस्तेमाल करेंगे कोड और लोगों में शामिल
मैं करने के लिए निर्देश दिया गया था।
>> और अब हम एक डेटा प्रकार है।
हम एक चार होने के लिए एक ओकटेट घोषित कर दिया है।
और हम हैं कि है कि बाद में देख लेंगे कोड भर में इस्तेमाल किया।
और हम घोषित कर दिया है एक प्रोटोटाइप की पूरी गुच्छा,
और हम के माध्यम से जल्दी से चलना होगा उन कार्यों में से प्रत्येक।
अन्त में, और शायद सबसे में रखना जरूरी
इस बिंदु में कम से मन कहानी यह है कि वहाँ
वास्तव में, एक पूरी कर रहे हैं वैश्विक चर का गुच्छा
फ़ाइल के शीर्ष पर, जड़, सीएफडी, SFD, अनुरोध, फाइल और शरीर।
>> अब आम तौर पर, तो कई वैश्विक का उपयोग कर चर, या सभी को एक वैश्विक चर,
वापस अभ्यास नहीं है।
लेकिन यह है कि हम भी एक का उपयोग कर रहे हैं पता चला है तकनीक बुलाया संकेत से निपटने के बाद में
हमें की अनुमति देता है, जो कोड में उपयोगकर्ता कुछ हिट जब पता लगा
के लिए CTRL सी और शट डाउन की तरह इनायत सर्वर।
और क्रम में शान से ऐसा करने के लिए और वास्तव में मुक्त स्मृति,
हम करने के लिए उपयोग करने की आवश्यकता है इन वैश्विक चर।
>> और अब के मुख्य पर एक नज़र, लेते हैं जो इस कार्यक्रम के पूरी तरह चलाता है।
सबसे पहले, यहाँ शीर्ष पर हम एक त्रुटि संख्या चर
कि नहीं प्रतीत होता है एक प्रकार है, लेकिन है कि
यह वास्तव में है, क्योंकि नामक एक फाइल में परिभाषित
त्रुटि errno.h जो उच्च ऊपर शामिल है।
आप वास्तव में करने के लिए errno आदमी करते हैं इस बात के लिए परिभाषा देखते हैं,
आप इस एक है कि देखेंगे विशेष वैश्विक चर कि
एक पूरी गुच्छा द्वारा निर्धारित है कार्यों का लिखा नहीं
हमारे द्वारा, लेकिन लिनक्स के लेखकों द्वारा और अन्य प्रणालियों वास्तव में स्थापित करने के लिए
कि चर जब कुछ करने के लिए एक नंबर गलत हो जाता है कि आप विश्व स्तर पर कर सकते हैं कि इतना
गलत जाना था पता लगाने की क्या।
>> अब नीचे नीचे आप एक नया देखेंगे तकनीक शायद, getopt का उपयोग कर
पार्स आदेश में मदद करता है कि एक समारोह लाइन तर्क हम नहीं करते तो यह है कि
लगाना समय बर्बाद परेशान बाहर 8080 की तरह कुछ पार्स करने के लिए कैसे,
या पानी का छींटा पी, या पानी का छींटा ज मदद पाने के लिए।
getopt अनिवार्य रूप से हमारे लिए ऐसा करता है।
अधिक जानकारी के लिए मैन पेज देखें।
>> अगला, हम त्रुटि के एक सा है सुनिश्चित करने के लिए जाँच कर रहा है
पोर्ट संख्या के भीतर है कि कल्पना में निर्दिष्ट सीमा होती है।
अगला, हम समारोह के लिए एक फोन देखना जिसका परिभाषा, हम करेंगे शुरू
एक पल में देखो, और अपने नाम के रूप में इस वेब सर्वर शुरू होता है, पता चलता है।
यहाँ हम एक समारोह के लिए एक फोन है जो कहते हैं, कहा जाता है, संकेत,
और अगर आप से नियंत्रण ग जब सुनते हैं उपयोगकर्ता के कीबोर्ड, आगे बढ़ो और कॉल
जा रहा है कि एक समारोह में कहा जाता हैंडलर अंततः स्वच्छ चीजों को और रोक
सर्वर।
>> नीचे है कि एक प्रतीत होता है क्या अनंत लूप, पहली पंक्ति जिसमें से
प्रभावी ढंग से एक फोन है कहा जाता है एक समारोह के लिए
खुद को हम, जो रीसेट क्रम में बाद में लागू
हमारे वैश्विक राज्यों में से कुछ को मुक्त करने के लिए।
उसके बाद की एक पंक्ति है कोड है कि सशर्त
वापसी जाँच कर रहा है जुड़ा के लिए मूल्य।
एक विधेय की तरह अब जुड़ा हुआ लग रहा है, सही है या गलत है कि रिटर्न कुछ।
और यह करता है, लेकिन वहाँ है कनेक्टेड में कुछ खास
उस में यह एक अवरुद्ध फोन है।
यह वहाँ बैठने के लिए और इंतजार करना होगा एक उपयोगकर्ता के ब्राउज़र तक
इस वेब से कनेक्ट करने की कोशिश करता है सर्वर और उसके बाद ही यह होगा
हम आगे बढ़ना है, ताकि सही है या गलत लौटने अगर यह बयान के अंदर करने के लिए।
>> एक बार वहाँ, एक करने के लिए इस समारोह को नोटिस हम लिखा था जिसमें पार्स बुलाया समारोह,
जो सब, ओकटेट के सभी डेसिमल एक ब्राउज़र से आ रही बाइट्स की
सर्वर के लिए, इतना है कि हम हाथ कर सकते हैं एक करने के लिए तुम वापस अंततः एक मूल्य
उन वैश्विक चर की है कि दुकानों बस में बाइट्स के सभी
इस बात का हेडर अनुरोध है, न कि शरीर
यह करने के लिए वास्तव में एक शरीर अगर वहाँ थे।
>> अब हम शुरू करने के लिए नीचे से नीचे निकालने के लिए उन हेडर पार्स
जानकारी का एक सबसेट हम के बारे में परवाह है।
विशेष रूप से, प्रति विनिर्देश, हम पहले
है, जो लाइन का अनुरोध करना चाहता था सिर्फ इतना है कि बहुत पहली पंक्ति है कि
उम्मीद है कि पाने के लिए की तरह कुछ कहना है स्लैश या कुछ पथ और फिर HTTP 1.1।
हम इस रूपक का उपयोग कर रहे हैं एक टेबल में एक सुई की
विशेष के लिए देखने के लिए वर्ण या पतों।
और वास्तव में, वहाँ की एक संख्या है हमारे वितरण कोड में कार्य करता है
आपको लगता है कि, भी, आपके लिए मददगार साबित हो सकता है विशेष मूल्यों के लिए देख रहे हैं।
>> अंत में, हम इन बाइट्स की प्रतिलिपि एक चर बुलाया लाइन में,
जो भी है, हम है, नोटिस ढेर पर आवंटित
एक गतिशील आकार सरणी के माध्यम से।
और हम जानबूझ कर कोशिश कर रहे हैं malloc के फोन से बचने के लिए
फिर, क्योंकि क्योंकि नियंत्रण ग की जा रही है
इस कार्यक्रम के एक संभावित सुविधा है, हम अचानक इस कोड है नहीं करना चाहते हैं
उपयोगकर्ता मार से बाधित नियंत्रण सी, जिनमें से परिणाम
मैं एक मौका नहीं हो सकता है मुक्त कुछ के लिए मैं malloced दिया है।
तो मुझे लगता है के रूप में ज्यादा उपयोग करने के लिए कोशिश कर रहा हूँ स्टैक की मैं यहाँ कर सकते है।
>> अगला डॉस के लिए की एक पूरी गुच्छा, ऊपर।
विनिर्देश व्याख्या करेंगे यहाँ उम्मीद है कि वास्तव में क्या पर,
लेकिन टिप्पणियों तुम्हें दे क्या का एक संकेत के आगे झूठ।
आप करने के लिए पहली जरूरत अनुरोध लाइन को मान्य
और ऐसा लग रहा है कि यह सुनिश्चित कर लें विनिर्देशों, तो बात करने के लिए, व्याकरण
यह चाहिए कहते हैं।
तुम तो कुछ निकालने की जरूरत बाहर सामान, क्वेरी बुलाया
एक प्रश्न चिह्न के बाद, जैसे हम अपने गूगल उदाहरण के साथ देखा
एक HD पैरामीटर में पारित में।
हम तो एक साथ जुटना वेब सर्वर की जड़
में है कि पथ के साथ अनुरोध है कि पहली पंक्ति
और का पूरा पथ फार्म फ़ाइल के लिए हम देखना चाहता हूँ।
>> इसके बाद, हम सुनिश्चित करने के लिए जा रहे हैं उस फ़ाइल मौजूद है और पठनीय है।
और फिर हम निकालने के लिए जा रहे हैं अपने फाइल एक्सटेंशन, .html या .php,
या कम है कि कुछ इस तरह के विस्तार अनुरोध किया स्ट्रिंग के बहुत अंत।
अगले एक पूरी है कोड का गुच्छा हम लिखा
वास्तव में पीएचपी उत्पन्न करने के लिए आप के लिए सामग्री उत्पन्न।
संक्षेप में, इस कोड नाम पर ले जाता है
फ़ाइल का आप PHP व्याख्या करना चाहते हैं।
हम बुलाया कुछ ने इसे पारित पीएचपी का दुभाषिया में एक पाइप।
यद्यपि के रूप में प्रतिक्रिया वापस जाओ प्रतिक्रिया एक ही फाइल थे।
और फिर हम उस फ़ाइल को खत्म हो चुका है पुनरावृति एक बफर में उन सब को खींच बाइट्स,
हम अंततः यह कर सकते हैं कि इतना उन्हें बाहर प्रिंट।
>> इनमें से वास्तव में, सभी dprintf करने के लिए यहां कॉल
हमें कुछ प्रिंट करने देता है एक फ़ाइल विवरणक कहा जाता है, जो
सिर्फ एक पूर्णांक है कि एक फ़ाइल का प्रतिनिधित्व करता है।
आत्मा में बहुत समान है लेकिन एक फ़ाइल से मौलिक रूप से अलग
स्टार सूचक।
आप जैसे वाक्य रचना का उपयोग कर सकते सूचना कैसे printf यहाँ मैं गतिशील कर सकते हैं कि इतना
लंबाई की तरह कुछ डालने एक HTTP हेडर के मूल्य के लिए
सामग्री लंबाई कहा जाता है।
और अंत में मैं इस्तेमाल किया समारोह वास्तव में लिखने के लिए सही
अनुरोध करने के लिए शरीर।
>> दुर्भाग्य से, हम केवल कार्यान्वित गतिशील रूप के लिए समर्थन
उत्पन्न पीएचपी फ़ाइलें।
हम के लिए समर्थन को लागू नहीं किया था स्थिर gifs तरह फ़ाइलों, और JPEGs,
और सीएसएस और HTML फ़ाइलों।
यही कारण है, दुर्भाग्य से, आप के लिए छोड़ दिया जाता है ग्राहक उद्देश्य के लिए प्रतिक्रिया करने के लिए
ऐसा करने के लिए।
वहाँ में तो आप यह है कि वहाँ मिल जाएगा ऐसा नहीं है कि ब्लॉक के भीतर बहुत प्रेरणा,
लेकिन कैसे पर एक छोटे से अधिक आप अगर हम, PHP कोड की व्याख्या के बारे में चला गया
कार्यों आप इस्तेमाल करेंगे एक छोटे से अलग कर रहे हैं।
>> वास्तव में, आप उधार ले सकते हैं कार्यशीलता के कुछ
शायद फोरेंसिक से समस्या सेट, क्योंकि
दिन के अंत में सब आप की जरूरत है क्या आप जानते हैं एक बार यहाँ क्या है खुले क्या फ़ाइल
क्या आप जानते हैं और एक बार यह तथाकथित है माइम प्रकार या सामग्री प्रकार,
आप उन बाइट्स में पढ़ने की जरूरत है और किसी तरह बाहर उन्हें वापस थूक।
>> इस की और अब एक दौरे फ़ाइल के अन्य कार्य करता है।
पहले से जुड़ा हुआ है ऊपर, जो सिर्फ सच रिटर्न
जब यह अंततः एक सुनता एक उपयोगकर्ता से कनेक्शन।
अगले त्रुटि है।
त्रुटि, इस बीच, के रूप में एक समारोह हम विभिन्न 400 के सभी संभाल करने के लिए लिखा
और 500 HTTP स्थिति तुम चाहते हो सकता है कि कोड
उपयोगकर्ता को वापस भेजने के लिए, एक मानक संदेश के साथ।
>> अगला अप लोड है, एक विशेष रूप से जिसका उद्देश्य जीवन में भावपूर्ण समारोह,
एक फ़ाइल स्टार से पढ़ने के लिए है सूचक एक वैश्विक बफर में एक फाइल की सामग्री
हम विश्व स्तर पर घोषित कि [ऊपर? मेन। ?]
इस प्रकार हम इस वजह से थोड़ा जटिल है फ़ाइल से बाइट्स पढ़ने के लिए है
लेकिन प्रत्येक यात्रा पर जांच हम पहले से ही है कि क्या
फ़ाइल के अंत या मारा कुछ और गलत हो गया है।
और हम सुनिश्चित करने के लिए realloc का उपयोग जो कुछ भी हम प्रयोग कर रहे बफर बढ़ रहा है
और बढ़ रही है और हमेशा बढ़ रही है और बाइट्स की संख्या के आगे रहने
हम वहाँ में फिट करने की आवश्यकता है।
हैंडलर, इस बीच, है हो जाता है कि समारोह
होने के रास्ते से बुलाया एक संकेत के रूप में नियंत्रण ग पंजीकृत
हम अवरोधन करने के लिए चाहते हैं।
हैंडलर में यहाँ नोटिस यह है कि अंततः
कॉल, बंद करो जो निश्चित रूप से वेब सर्वर बंद हो जाता है।
और दुर्भाग्य से, देखने का लागू नहीं है।
आत्मा में, यह एक है काफी सरल कार्य करते हैं।
एक फाइल एक्सटेंशन को देखते हुए यह जरूरत यह माइम तथाकथित की वापसी के लिए
प्रकार या सामग्री प्रकार।
और हम विनिर्देश में निर्दिष्ट कि मानचित्रण होना चाहिए क्या।
लेकिन आप अनुवाद करने की जरूरत है अंततः सी कोड के लिए यह।
>> अगला ऊपर हमारी इसी तरह भावपूर्ण समारोह है जीवन में जिसका उद्देश्य पार्स बुलाया
नहीं एक फ़ाइल से पढ़ने के लिए है, लेकिन एक नेटवर्क कनेक्शन से।
विशेष रूप से, पढ़ने और पार्स एक ब्राउज़र से आ रहा है कि HTTP अनुरोध
इतना है कि सर्वर के लिए अंततः हम पार्स कर सकते हैं
अनुरोध में सिर्फ हेडर पर रेखा और आप के लिए उन पर लौटने
एक वैश्विक बफर के माध्यम से कि हम [ऊपर घोषित? मेन। ?]
>> इस बीच, एक है, रीसेट हम परिभाषित है कि समारोह
कि iteratively अंदर बुलाया जाता है मुख्य हर बार की आप के बारे में कर रहे हैं
सुन शुरू करने के लिए तैयार एक नए कनेक्शन के लिए
हम हमेशा पता है कि इतने हमारे चर के राज्य
और इतना है कि हम भी है किसी भी स्मृति मुक्त कर दिया है कि
के लिए आवंटित किया गया है हो सकता है पिछले एक नेटवर्क कनेक्शन।
अगला ऊपर है शुरू, हम ने लिखा है कि समारोह
कि एक पूरे होता है नेटवर्किंग कोड का बहुत कुछ
कि अंततः वेब सर्वर शुरू होता है।
>> पिछले समारोह है कहा जाता है बंद करो, जो
ठीक है कि नहीं करता है, यह वेब सर्वर बंद हो जाता है।
लेकिन पहले यह किसी भी स्मृति को मुक्त कर देते कि अभी भी आवंटित कर दिया गया है।
लेकिन यह अंततः बाहर निकलने के कॉल यहां तक ​​कि नियंत्रण लौटने के बिना
हमारा मुख्य कार्य करने के लिए।
अंत में, में से एक सबसे महत्वपूर्ण तकनीक
को लागू करने के लिए जब इस वेब सर्वर है परीक्षण और त्रुटि के एक सा हो जा रहा है,
एक ब्राउज़र विंडो खोलने होने पर सही और एक टर्मिनल विंडो पर
छोड़ दिया, सर्वर कंसोल खिड़की, इतना है कि आप
कर रहे हैं कि संदेशों को देख सकते हैं स्क्रीन पर प्रदर्शित किया जा रहा है।
>> लेकिन बेहतर अभी भी एक तिहाई होगा खिड़की, एक दूसरे टर्मिनल विंडो,
जिसमें आप टेलनेट, उपयोग का उपयोग जिसके लिए कल्पना में निर्धारित है।
और Telnet सिर्फ एक बहुत है सरल नेटवर्क कार्यक्रम
कि आप का नाटक करने की सुविधा देता है एक खिड़की में एक ब्राउज़र हो
अन्य खिड़की से बात करते हुए।
जैसा कि आप देख सकते हैं इस तरह बिल्कुल शाब्दिक आदेशों
वापस आ रहे हैं कि सर्वर से ग्राहक के लिए
poking के लिए बिना क्रोम डेवलपर के आसपास
एक अन्यथा में उपकरणों clunkier इंटरफेस।