2010-10-25 44 views
6

Tôi đang cố gắng viết máy chủ http 1.1 của riêng mình, chỉ để cho vui và tìm hiểu thêm về HTTP, ổ cắm và luồng.Lập trình Máy chủ HTTP

Tôi đã có một khởi đầu tốt, tôi nghĩ rằng chỉ với việc cung cấp các trang tĩnh (sử dụng c, mà tôi muốn ở lại trong thời gian này). Tôi có một trang thử nghiệm tôi đã viết một thời gian trước đây và cung cấp nó ~ 50 tập tin trong 124ms theo chrome, mà không cần sử dụng chủ đề hoặc ổ cắm còn sống.

Tôi thấy rất khó để có được luồng/tiếp tục hoạt động. Có rất ít hoặc không có tài nguyên trên web (mà tôi có thể tìm thấy trong giờ của tôi Googling) giải thích chi tiết các kết nối liên tục. Nếu bất cứ ai có thể giới thiệu một cuốn sách hay về lập trình máy chủ HTTP, tôi sẽ đánh giá cao nó.

Tôi đã thực hiện một số luồng và lập trình socket trước khi thực hiện một chương trình trò chuyện đơn giản, vì vậy tôi có ít nhất một số trải nghiệm với nó.

Vấn đề tôi gặp phải là khi cố gắng kết hợp các chủ đề, trình duyệt của khách hàng sẽ thiết lập nhiều kết nối. Một nơi nào đó dọc theo dòng, máy chủ bị nhầm lẫn và khách hàng chỉ ngồi đó chờ đợi phản hồi và máy chủ ngừng làm bất cứ điều gì. Tôi gửi tiêu đề Connection: Keep-Alive, nhưng điều đó không thay đổi bất cứ thứ gì và khi tôi kết hợp nó và tạo một vòng lặp để nhận các yêu cầu trong hàm luồng, nó sẽ dừng lại cho đến khi kết nối được đóng lại.

Tôi sẽ đánh giá cao nếu ai đó có thể cung cấp cho tôi một số mã giả về cách giữ sống/luồng làm việc cho việc này để khách hàng ngừng tạo nhiều kết nối cùng một lúc.

Một mô tả ngắn gọn về whats going on:

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

Làm thế nào về RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

Bạn có chắc chắn đó là một vấn đề liên quan đến luồng không? Ngoài ra, bạn có đặt tiêu đề Content-Length không? Tôi nghĩ rằng nó là cần thiết để giữ cho sống để làm việc (trừ khi bạn sử dụng chunking). –

+0

Tôi cũng đang sử dụng tiêu đề có độ dài nội dung và nó đang gửi kích thước phù hợp cho mỗi thư. Lý do duy nhất tôi nói đó là chủ đề liên quan là tôi không có vấn đề cho đến khi tôi bắt đầu sử dụng đề tài. Nếu tôi cố gắng thực hiện giữ-sống mà không có chủ đề nó chỉ mất trang mãi mãi để cung cấp. – Wolftousen

Trả lời

1

tôi khuyên bạn nên lấy nguồn cho Apache và nhìn thấy cách họ xử lý nó. Không có nhiều điểm trong mã psuedo khi bạn có thể thấy cách thực tế hoạt động.

+0

Những suy nghĩ tuyệt vời cũng giống nhau ? ;) – alex

+0

câu trả lời của chúng tôi phải được thông qua trong các ống :) –

1

Có lẽ bạn có thể xem Apache's code để biết một số manh mối. Nó được viết bằng C.

Hy vọng rằng ai đó sẽ đi cùng và đưa ra một câu trả lời chi tiết hơn :)

+0

Tôi đang cố gắng tránh làm điều này càng nhiều càng tốt. Tôi bắt đầu ngày hôm trước, nhưng lọc những thứ mà tôi không cần biết vào lúc này từ những thứ tôi cần rất tốn thời gian. – Wolftousen

2

tôi sẽ khuyên bạn nên nhìn vào GNU libmicrohttpd. Nó tập trung vào việc cung cấp một khuôn khổ để xây dựng các máy chủ HTTP 1.1. Nó là nhỏ và hỗ trợ giữ-sống có và không có luồng. (Cá nhân tôi sử dụng nó mà không có luồng. Nó có một số kiểu luồng nữa.)

Thậm chí nếu bạn quyết định viết máy chủ web của mình từ đầu, tôi khuyên bạn nên xem libmicrohttpd để hiểu rõ hơn cách thức hoạt động của giao thức. làm thế nào các mô hình thư viện "dòng công việc" của một máy chủ web một cách rất sạch sẽ. Tôi nghĩ rằng đó là một sai lầm để tưởng tượng rằng giữ sống ngụ ý luồng và tôi nghĩ rằng đó là một trở ngại cho sự hiểu biết giữ sống.

(Về tín dụng Apache như một máy chủ web, nó là khá lớn, và có một nhiều trong đó không liên quan đến các giao thức, mà là những thứ như hệ thống plugin của nó và vân vân.)

+0

Cảm ơn, tôi sẽ xem xét điều đó sau khi tôi ra khỏi công việc hôm nay. – Wolftousen

Các vấn đề liên quan