C'de basit bir HTTP sunucusu oluşturun [kapalı]


105

C'de basit bir HTTP sunucusu oluşturmam gerekiyor. Herhangi bir rehberlik var mı? Bağlantılar? Örnekler?


1
Ben de aynen öyle düşünmüştüm
Rik

1
Ben de şimdi aynı sorunu yaşadım. Bu bağlantıyı kullandım . Umarım bu da sana yardımcı olur.
Udara SS Liyanage

1
nasıl soru sorulacağına dair SSS hakkında . 3K'dan sonra bunun gerçek bir soru olmadığını bilmelisiniz, nasıl bu kadar çok oy alabilir?


1
Görünüşe göre bu çok faydalı bir sorudur. Neden kapalıdır?
McBear Holden

Yanıtlar:


85

Küçük httpd'ye bir göz atmanızı öneririm . Sıfırdan yazmak istiyorsanız, RFC 2616'yı baştan sona okumak isteyeceksiniz . Ağa gerçekten düşük bir düzeyde erişmek için BSD soketlerini kullanın .


2
Veya inetd'yi kullanın ve ağ oluşturma bölümünü atlayın.
jrockway

22
Okumayın RFC 2616 : şimdi, tarafından obsoleted RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpdayrıca buradan github'da
Purplejacket

119

Şunlara bir göz atmanızı tavsiye ederim: İstemci ve Sunucu Yazmak İçin Pratik Bir Kılavuz

Artımlı adımlarla uygulamanız gereken şey:

  1. Temel TCP soket katmanınızı çalıştırın (bağlantı noktası / bağlantı noktalarını dinleyin, istemci bağlantılarını kabul edin ve veri gönderin / alın).
  2. Tamponlu bir okuyucu uygulayın, böylece istekleri bir seferde bir satır (CRLF ile sınırlandırılmış) okuyabilirsiniz.
  3. İlk satırı okuyun. Yöntemi, istek sürümünü ve yolu ayrıştırın.
  4. "Üstbilgi: değer" sözdizimi için üstbilgi ayrıştırmasını uygulayın. Katlanmış başlıkları açmayı unutmayın.
  5. Gövdenin nasıl / okunup okunmayacağını belirlemek için istek yöntemini, içerik türünü ve içerik boyutunu kontrol edin.
  6. İçerik türüne göre içeriğin kodunu çözmeyi uygulayın.
  7. HTTP 1.1'i destekleyecekseniz, "100 Devam", canlı tutma, yığın halinde aktarım gibi şeyleri uygulayın.
  8. Eksik istekleri tespit etme, maksimum istemci sayısını sınırlama vb. Gibi sağlamlık / güvenlik önlemleri ekleyin.
  9. Kodunuzu küçültün ve açık kaynak kodlayın :)

9. Nokta, özellikle buraya bir soru gönderdikten sonra, +1 :)
Matthieu

26

Bir HTTP sunucusu kavramsal olarak basittir:

  • Dinlemek için 80 numaralı bağlantı noktasını açın
  • Temas kurulduğunda biraz bilgi toplayın (esas olarak alın - gerisini şimdilik görmezden gelebilirsiniz)
  • İsteği bir dosya isteğine çevirin
  • Dosyayı açın ve istemciye geri yazın

Ne kadar HTTP'yi desteklemek istediğinize bağlı olarak daha da zorlaşır - POST biraz daha karmaşıktır, komut dosyaları, birden fazla isteği işleme vb.

Ancak temel çok basit.



12

Yeni bağlantılar için dinlemeye başlayın, 80 numaralı bağlantı noktasında bir TCP soketi açın uygulamak bu . Amaçlarınıza bağlı olarak neredeyse her şeyi görmezden gelebilirsiniz. En kolay durumda, her istek için aynı yanıtı gönderebilirsiniz, bu sadece sokete metin yazmayı içerir.


11

"Sadece 200 satırlık C kaynak koduna sahip küçük, güvenli bir web sunucusu [...] olan nweb'e (Nigel'in Web Sunucusu) bakın:

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

Makale sözde kod, açıklamalar ve yorumlar içerir.

DÜZENLEME: IBM'in bağlantısı kesildi. Web sayfasının bir PDF dosyasını Google Drive'a kaydettim. İşte kod indirme:

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

@ ankushagarwal birkaç değişiklik yaptı ve sürümünü GitHub'a yükledi: https://github.com/ankushagarwal/nweb


Bağlantıyı kontrol etmeden oy verdi: / Bahsettiğiniz şeyi tam olarak arıyorum, bir şey bulursanız bana ping atabilir misiniz? Txt
samayo

1
@samayo IBM'in bağlantısı kesildi. Bazı aynalar sağladım.
XP1

İşte archive.org'dan bir ayna - umarım gelecek yıllar boyunca buralarda olacaktır: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246




2

http://www.manning.com/hethmon/ - Manning'in "Paul S. Hethmon tarafından yazılan Resimli HTTP Kılavuzu", HTTP protokolünü öğrenmek için çok iyi bir kitaptır ve onu uygulayan / genişleten biri için çok faydalı olacaktır.


1

Apache'nin arkasındaki kişilerin yaptığı gibi, HTTP protokolünü kapsüllemek için platforma özgü soket işlevlerini kullanın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.