2010-10-25 11 views
6

मैं अपने स्वयं के http 1.1 सर्वर को लिखने का प्रयास कर रहा हूं, सिर्फ मज़ेदार और HTTP, सॉकेट और थ्रेडिंग के बारे में अधिक जानने के लिए।HTTP सर्वर प्रोग्रामिंग

मुझे अच्छी शुरुआत मिली है, मुझे केवल स्थिर पृष्ठों को वितरित करने के साथ ही लगता है (सी का उपयोग करके, जिसे मैं समय के लिए रहना पसंद करूंगा)। मेरे पास एक परीक्षण पृष्ठ है जिसे मैंने कुछ समय पहले लिखा था और क्रोम के अनुसार 124ms में ~ 50 फाइलें वितरित किए बिना थ्रेड या जीवित सॉकेट का उपयोग किए।

मुझे थ्रेडिंग/जीवित रहने में बहुत मुश्किल लग रही है। वेब पर बहुत कम संसाधन नहीं हैं (जो कि मैं गुगलिंग के अपने घंटों में पा सकता हूं) जो विस्तार से रहने वाले कनेक्शन को विस्तार से समझाते हैं। अगर कोई HTTP सर्वर प्रोग्रामिंग पर एक अच्छी किताब की सिफारिश कर सकता है, तो मैं इसकी सराहना करता हूं।

मैंने एक साधारण चैट प्रोग्राम बनाकर पहले कुछ थ्रेडिंग और सॉकेट प्रोग्रामिंग किया है, इसलिए मेरे पास कम से कम कुछ अनुभव है।

मेरा मुद्दा यह है कि जब मैं धागे को शामिल करने का प्रयास करता हूं, तो क्लाइंट ब्राउज़र एकाधिक कनेक्शन सेट करता है। रेखा के साथ कहीं, सर्वर भ्रमित हो जाता है और ग्राहक बस प्रतिक्रियाओं के लिए इंतजार कर बैठता है और सर्वर कुछ भी करने से रोकता है। मैं कनेक्शन भेजता हूं: Keep-Alive हेडर, लेकिन यह कुछ भी नहीं बदलेगा और जब मैं इसे जीवित रखता हूं और थ्रेडेड फ़ंक्शन में अनुरोध प्राप्त करने के लिए लूप बना देता हूं, तो कनेक्शन बंद होने तक यह स्टाल हो जाता है।

अगर कोई मुझे कुछ छद्म कोड दे सकता है तो इस पर कुछ छद्म कोड दे सकता है कि इस के लिए काम करने वाले जीवित/थ्रेडिंग को कैसे बनाए रखा जाए ताकि ग्राहक एक समय में कई कनेक्शन बना सके।

क्या चल रहा का एक संक्षिप्त विवरण:

main function

load in static pages to large array of fileinfo struct that hold the file data and length 
create the socket 
set it to listen to port 80 
set it to listen for 10 connections at a time(i know this is low...) 
start an endless loop 
     block while waiting for someone to connect 
     check if it's a localhost connection 
      shutdown the server 
     otherwise 
      start a thread(with pthread), sending it the socket variable 
loop 


Thread Function

setsock opt for 3 sec timeout on send/recv and enable Keep-alive 
start endless loop 
    read in request 
    if request timed out, break the loop 
    Validate Request function call 
    Create Reponse function call 
    Send response 
    if request contained Connection: close header break the loop 
loop 
close socket 
return 

+1

कैसे के बारे में आरएफसी 2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

क्या आप वाकई एक थ्रेडिंग संबंधित समस्या है? क्या आप सामग्री-लंबाई शीर्षलेख भी सेट कर रहे हैं? मुझे लगता है कि काम करने के लिए जिंदा रखने के लिए जरूरी है (जब तक आप चंकिंग का उपयोग नहीं करते)। –

+0

मैं सामग्री-लंबाई शीर्षलेख का भी उपयोग कर रहा हूं और यह प्रत्येक संदेश के लिए उचित आकार भेज रहा है। एकमात्र कारण मैं कहता हूं कि यह धागा संबंधित है कि जब तक मैं थ्रेड का उपयोग शुरू नहीं करता तब तक मुझे कोई समस्या नहीं है। अगर मैं धागे के बिना जीवित रहने को लागू करने का प्रयास करता हूं तो यह पृष्ठ हमेशा के लिए वितरित करने के लिए लेता है। – Wolftousen

उत्तर

1

मैं अपाचे के लिए स्रोत हथियाने और देख कैसे वे इसे संभाल सलाह देते हैं। Psuedo कोड में बहुत अधिक बिंदु नहीं है जब आप देख सकते हैं कि असली चीज़ कैसे काम करती है।

+0

ग्रेट दिमाग एक जैसे सोचते हैं ? ;) – alex

+0

हमारे उत्तरों को ट्यूबों में पारित होना चाहिए :) –

1

शायद आप कुछ सुराग के लिए Apache's code देख सकते हैं। यह सी

में लिखा है उम्मीद है कि किसी के साथ आते हैं और एक अधिक विस्तृत जवाब :)

+0

मैं जितना संभव हो सके इसे करने से बचने की कोशिश कर रहा हूं। मैंने दूसरे दिन शुरू किया, लेकिन उन चीजों को फ़िल्टर करना जिन्हें मुझे इस समय जानना जरूरी नहीं है कि मुझे बहुत समय लगता है। – Wolftousen

2

मैं GNU libmicrohttpd देखने की सलाह देते हैं दे देंगे। यह HTTP 1.1 सर्वर बनाने के लिए एक ढांचा प्रदान करने पर पूरी तरह से केंद्रित है। यह छोटा है और थ्रेडिंग के साथ और बिना जीवित रहने का समर्थन करता है। (व्यक्तिगत रूप से मैं इसे थ्रेडिंग के बिना उपयोग करता हूं। इसमें कई थ्रेडिंग मॉडल भी हैं।)

भले ही आप अपने वेब सर्वर को स्क्रैच से लिखने का निर्णय लेते हैं, फिर भी मैं प्रोटोकॉल कैसे काम करता है, अंतर्दृष्टि प्राप्त करने के लिए libmicrohttpd को देखने का सुझाव दूंगा, लेकिन लाइब्रेरी मॉडल एक वेब सर्वर के "काम प्रवाह" को बहुत साफ तरीके से कैसे पेश करता है। मुझे लगता है कि यह कल्पना करने की गलती है कि जीवित रहने का तात्पर्य है और मुझे लगता है कि यह जीवित रहने को समझने में बाधा है।

(एक वेब सर्वर के रूप में अपाचे 'क्रेडिट के बारे में, यह बहुत बड़ा है, और वहाँ में वहाँ प्रोटोकॉल से संबंधित नहीं एक बहुत है, बल्कि इसकी प्लगइन प्रणाली और इतने पर तरह बातें।)

+0

धन्यवाद, मैं आज काम से बाहर निकलने के बाद उसमें देख लूंगा। – Wolftousen

संबंधित मुद्दे