Xây dựng một máy chủ HTTP đơn giản trong C [đóng]


105

Tôi cần xây dựng một máy chủ HTTP đơn giản trong C. Có hướng dẫn nào không? Các liên kết? Mẫu?


1
Đó chính xác là những gì tôi nghĩ
Rik

1
Tôi cũng có cùng một vấn đề bây giờ. Tôi đã sử dụng liên kết này . Hy vọng điều này sẽ giúp bạn.
Udara SS Liyanage

1
còn Câu hỏi thường gặp về cách đặt câu hỏi. bạn nên biết sau 3K đại diện rằng đây không phải là một câu hỏi thực sự, làm thế nào nó có thể nhận được nhiều phiếu bầu như vậy?

Làm thế nào về vấn đề này> github.com/Taymindis/fcgi-function/wiki/...
Oktaheta

1
Đây rõ ràng là một câu hỏi rất hữu ích. Tại sao nó bị đóng cửa?
McBear Holden

Câu trả lời:


85

Tôi khuyên bạn nên xem qua httpd nhỏ . Nếu bạn muốn viết nó từ đầu, thì bạn sẽ muốn đọc kỹ RFC 2616 . Sử dụng ổ cắm BSD để truy cập mạng ở mức thực sự thấp.


2
Hoặc sử dụng inetd và bỏ qua phần kết nối mạng.
jrockway

22
Đừng đọc RFC 2616 bây giờ, nó lỗi thời bởi: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpdcũng là trên github đây: github.com/larryhe/tinyhttpd
Purplejacket

119

Tôi khuyên bạn nên xem qua: Hướng dẫn thực hành để viết máy khách và máy chủ

Những gì bạn phải triển khai theo các bước tăng dần là:

  1. Chạy lớp ổ cắm TCP cơ bản của bạn (lắng nghe trên cổng / cổng, chấp nhận kết nối máy khách và gửi / nhận dữ liệu).
  2. Triển khai một trình đọc được đệm để bạn có thể đọc các yêu cầu một dòng (được phân cách bằng CRLF) tại một thời điểm.
  3. Đọc dòng đầu tiên. Phân tích cú pháp phương thức, phiên bản yêu cầu và đường dẫn.
  4. Triển khai phân tích cú pháp tiêu đề cho cú pháp "Header: value". Đừng quên mở ra các tiêu đề gấp.
  5. Kiểm tra phương thức yêu cầu, loại nội dung và kích thước nội dung để xác định cách / nếu phần nội dung sẽ được đọc.
  6. Thực hiện giải mã nội dung dựa trên loại nội dung.
  7. Nếu bạn sẽ hỗ trợ HTTP 1.1, hãy triển khai những thứ như "100 Tiếp tục", duy trì hoạt động, truyền theo từng đoạn.
  8. Thêm các biện pháp bảo mật / mạnh mẽ như phát hiện các yêu cầu chưa hoàn thành, giới hạn số lượng khách hàng tối đa, v.v.
  9. Thu gọn mã của bạn và mã nguồn mở của nó :)

Điểm # 9, đặc biệt là sau khi đăng câu hỏi ở đây, +1 :)
Matthieu

26

Máy chủ HTTP đơn giản về mặt khái niệm:

  • Mở cổng 80 để nghe
  • Khi liên hệ được thực hiện, hãy thu thập một ít thông tin (chủ yếu lấy - bạn có thể bỏ qua phần còn lại bây giờ)
  • Dịch yêu cầu thành một yêu cầu tệp
  • Mở tệp và trả lại cho khách hàng

Nó trở nên khó khăn hơn tùy thuộc vào lượng HTTP bạn muốn hỗ trợ - POST phức tạp hơn một chút, các tập lệnh, xử lý nhiều yêu cầu, v.v.

Nhưng cơ sở là rất đơn giản.


25

Mongoose (Trước đây là Daemon đơn giản HTTP) khá tốt. Đặc biệt, nó có thể nhúng và biên dịch trong Windows, Windows CE và UNIX.


12

Mở ổ cắm TCP trên cổng 80, bắt đầu lắng nghe các kết nối mới, thực hiện điều này . Tùy thuộc vào mục đích của bạn, bạn có thể bỏ qua hầu hết mọi thứ. Dễ dàng nhất, bạn có thể gửi cùng một phản hồi cho mọi yêu cầu, chỉ cần ghi văn bản vào socket.


11

Nhìn vào nweb (Máy chủ web của Nigel), "một máy chủ web nhỏ, an toàn [...] chỉ với 200 dòng mã nguồn C":

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

Bài báo bao gồm mã giả, giải thích và bình luận.

CHỈNH SỬA: Liên kết của IBM đã chết. Tôi đã lưu một bản PDF của trang web vào Google Drive. Đây là phần tải xuống mã:

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing

@ ankushagarwal đã thực hiện một vài thay đổi và tải lên phiên bản của anh ấy trên GitHub: https://github.com/ankushagarwal/nweb


Eh up bình chọn mà không cần kiểm tra liên kết: / Tôi đang tìm kiếm chính xác điều bạn đã đề cập, nếu bạn tìm thấy điều gì đó, bạn có thể ping cho tôi không? Txt
samayo

1
@samayo Liên kết của IBM đã chết. Tôi đã cung cấp một số tấm gương.
XP1

Dưới đây là một tấm gương bởi archive.org - mà hy vọng sẽ được xung quanh cho năm tới: web.archive.org/web/20140905115151/http://www.ibm.com/...
james246




2

http://www.manning.com/hethmon/ - "Hướng dẫn minh họa về HTTP của Paul S. Hethmon" từ Manning là một cuốn sách rất hay để học giao thức HTTP và sẽ rất hữu ích cho ai đó đang triển khai / mở rộng nó.


1

Sử dụng các hàm socket cụ thể của nền tảng để đóng gói giao thức HTTP, giống như những người đứng sau Apache đã làm.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.