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
Làm thế nào về RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
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). –
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