สร้างเซิร์ฟเวอร์ HTTP อย่างง่ายใน C [ปิด]


105

ฉันต้องการสร้างเซิร์ฟเวอร์ HTTP อย่างง่ายใน C มีคำแนะนำหรือไม่ ลิงค์? ตัวอย่าง?


1
นั่นคือสิ่งที่ฉันคิด
Rik

1
ตอนนี้ฉันก็มีปัญหาเหมือนกัน ฉันใช้ลิงค์นี้ หวังว่านี่จะช่วยคุณได้เช่นกัน
Udara SS Liyanage

1
วิธีการเกี่ยวกับคำถามที่พบบ่อยเกี่ยวกับวิธีการถามคำถาม คุณควรรู้หลังจากตัวแทน 3K ว่านี่ไม่ใช่คำถามจริงๆแล้วมันจะได้รับคะแนนโหวตมากมายขนาดนี้ได้อย่างไร?

เป็นอย่างไรบ้าง> github.com/Taymindis/fcgi-function/wiki/…
Oktaheta

1
เห็นได้ชัดว่านี่เป็นคำถามที่มีประโยชน์มาก ทำไมถึงปิด?
McBear Holden

คำตอบ:


86

ผมขอแนะนำให้คุณลองดูที่httpd เล็ก ๆ หากคุณต้องการที่จะเขียนมันจากรอยขีดข่วนแล้วคุณจะต้องการที่จะได้อย่างทั่วถึงอ่านRFC 2616 ใช้ซ็อกเก็ต BSDเพื่อเข้าถึงเครือข่ายในระดับที่ต่ำมาก


2
หรือใช้ inetd และข้ามส่วนเครือข่าย
jrockway

22
อย่าอ่านRFC 2616ตอนนี้มันล้าสมัยโดย: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpdอยู่ใน github ที่นี่: github.com/larryhe/tinyhttpd
Purplejacket

119

เราขอแนะนำให้คุณดูที่: คู่มือที่เป็นประโยชน์สำหรับการเขียนไคลเอนต์และเซิร์ฟเวอร์

สิ่งที่คุณต้องดำเนินการตามขั้นตอนเพิ่มเติมคือ:

  1. เรียกใช้เลเยอร์ซ็อกเก็ต TCP พื้นฐานของคุณ (ฟังพอร์ต / พอร์ตยอมรับการเชื่อมต่อไคลเอนต์และส่ง / รับข้อมูล)
  2. ใช้โปรแกรมอ่านบัฟเฟอร์เพื่อให้คุณสามารถอ่านคำขอทีละบรรทัด (คั่นด้วย CRLF)
  3. อ่านบรรทัดแรก แยกวิเคราะห์เมธอดเวอร์ชันคำขอและพา ธ
  4. ใช้การแยกวิเคราะห์ส่วนหัวสำหรับไวยากรณ์ "Header: value" อย่าลืมกางส่วนหัวที่พับออก
  5. ตรวจสอบวิธีการร้องขอประเภทเนื้อหาและขนาดเนื้อหาเพื่อกำหนดว่าจะอ่านเนื้อหาอย่างไร / หรือไม่
  6. ใช้การถอดรหัสเนื้อหาตามประเภทเนื้อหา
  7. หากคุณจะรองรับ HTTP 1.1 ให้ใช้สิ่งต่างๆเช่น "100 Continue" การถ่ายโอนที่มีชีวิตอยู่ต่อไป
  8. เพิ่มความแข็งแกร่ง / มาตรการรักษาความปลอดภัยเช่นการตรวจจับคำขอที่ไม่สมบูรณ์การ จำกัด จำนวนลูกค้าสูงสุดเป็นต้น
  9. หดห่อรหัสของคุณและโอเพ่นซอร์ส :)

จุด # 9 โดยเฉพาะหลังจากโพสต์คำถามที่นี่ +1 :)
Matthieu

27

เซิร์ฟเวอร์ HTTP เป็นแนวคิดที่เรียบง่าย:

  • เปิดพอร์ต 80 เพื่อฟัง
  • เมื่อมีการติดต่อให้รวบรวมข้อมูลเล็กน้อย (รับส่วนใหญ่ - คุณสามารถเพิกเฉยต่อส่วนที่เหลือได้ในตอนนี้)
  • แปลคำขอเป็นคำขอไฟล์
  • เปิดไฟล์และพ่นกลับที่ไคลเอนต์

จะยากขึ้นขึ้นอยู่กับจำนวน HTTP ที่คุณต้องการสนับสนุน - POST ซับซ้อนกว่าเล็กน้อยสคริปต์การจัดการคำขอหลายรายการ ฯลฯ

แต่ฐานนั้นเรียบง่ายมาก


25

พังพอน (เดิมชื่อ Simple HTTP Daemon) ค่อนข้างดี โดยเฉพาะอย่างยิ่งสามารถฝังและคอมไพล์ภายใต้ Windows, Windows CE และ UNIX


12

เปิดซ็อกเก็ต TCP บนพอร์ต 80, เริ่มต้นการฟังสำหรับการเชื่อมต่อใหม่ดำเนินการนี้ ขึ้นอยู่กับวัตถุประสงค์ของคุณคุณสามารถละเว้นเกือบทุกอย่างได้ อย่างง่ายที่สุดคุณสามารถส่งคำตอบเดียวกันสำหรับทุกคำขอซึ่งเกี่ยวข้องกับการเขียนข้อความลงในซ็อกเก็ต


11

ดู nweb (เว็บเซิร์ฟเวอร์ของ Nigel) "เว็บเซิร์ฟเวอร์ขนาดเล็กที่ปลอดภัย [... ] ด้วยซอร์สโค้ด C เพียง 200 บรรทัด":

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

บทความนี้มีรหัสเทียมคำอธิบายและความคิดเห็น

แก้ไข: ลิงก์ของ IBM เสียชีวิตแล้ว ฉันได้บันทึก PDF ของหน้าเว็บไปยัง Google Drive นี่คือการดาวน์โหลดรหัส:

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

@ ankushagarwalได้ทำการเปลี่ยนแปลงเล็กน้อยและอัปโหลดเวอร์ชันของเขาบน GitHub: https://github.com/ankushagarwal/nweb


เอ่อโหวตโดยไม่ตรวจสอบลิงค์: / ฉันกำลังมองหาสิ่งที่คุณพูดถึงถ้าคุณพบบางสิ่งบางอย่างคุณสามารถ ping ฉัน? Txt
samayo

1
ลิงก์ของ @samayo IBM เสียชีวิตแล้ว ฉันได้จัดหากระจกบางส่วน
XP1

นี่คือภาพสะท้อนจาก archive.org - ซึ่งหวังว่าจะมีขึ้นในอีกหลายปีข้างหน้า: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246

5

ฉันเขียนของฉันเองว่าคุณสามารถใช้ได้ งานนี้มี sqlite เป็นเธรดที่ปลอดภัยและอยู่ใน C ++ สำหรับ UNIX

คุณควรจะแยกมันออกจากกันได้และใช้รหัสที่เข้ากันได้กับ C

http://code.google.com/p/mountain-cms/




2

http://www.manning.com/hethmon/ - "Illustrated Guide to HTTP by Paul S. Hethmon" จาก Manning เป็นหนังสือที่ดีมากในการเรียนรู้โปรโตคอล HTTP และจะมีประโยชน์มากสำหรับผู้ที่นำไปใช้ / ขยาย


1

การใช้งานฟังก์ชั่นซ็อกเก็ตแพลตฟอร์มที่เฉพาะเจาะจงเพื่อแค็ปซูลโปรโตคอล HTTP เช่นเดียวกับคนที่อยู่เบื้องหลังApacheได้


1

มี ซ้ำกับการตอบสนองมากขึ้น

ผู้สมัครคนหนึ่งไม่ได้กล่าวถึงยังเป็นพาเรนต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.