मैं अपने स्वयं के 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
कैसे के बारे में आरएफसी 2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
क्या आप वाकई एक थ्रेडिंग संबंधित समस्या है? क्या आप सामग्री-लंबाई शीर्षलेख भी सेट कर रहे हैं? मुझे लगता है कि काम करने के लिए जिंदा रखने के लिए जरूरी है (जब तक आप चंकिंग का उपयोग नहीं करते)। –
मैं सामग्री-लंबाई शीर्षलेख का भी उपयोग कर रहा हूं और यह प्रत्येक संदेश के लिए उचित आकार भेज रहा है। एकमात्र कारण मैं कहता हूं कि यह धागा संबंधित है कि जब तक मैं थ्रेड का उपयोग शुरू नहीं करता तब तक मुझे कोई समस्या नहीं है। अगर मैं धागे के बिना जीवित रहने को लागू करने का प्रयास करता हूं तो यह पृष्ठ हमेशा के लिए वितरित करने के लिए लेता है। – Wolftousen