สามารถใช้ C ++ เป็นภาษาพัฒนาเว็บฝั่งเซิร์ฟเวอร์ได้หรือไม่ [ปิด]


34

ฉันต้องการพัฒนาเว็บไซต์โดยใช้ C ++ เป็น "ภาษาสคริปต์" บนฝั่งเซิร์ฟเวอร์ โครงสร้างพื้นฐานเซิร์ฟเวอร์ของฉันใช้เป็น * nix ดังนั้นการทำการพัฒนาเว็บไซต์ใน C ++ บน Azure จึงไม่สามารถทำได้และ C ++ / CLI ASP.NET ก็ใช้ไม่ได้เช่นกัน

แยกจากแอปพลิเคชั่น CGI รุ่นเก่าสามารถพัฒนาเว็บไซต์ด้วย C ++ ได้หรือไม่?


33
แน่นอนมันเป็นไปได้คำถามคือ; มันใช้งานได้จริงหรือ
เอ็ดเอส

ดูคำถามนี้ใน stackoverflow.com
kevin cline

24
คุณสามารถใช้แอสเซมบลีเป็นภาษาฝั่งเซิร์ฟเวอร์ถ้าคุณมีแนวโน้ม
Channel72

8
หรือแม้กระทั่ง Brainf * CK ถ้า,จะ.มีการเปลี่ยนเส้นทางไปยังซ็อกเก็ต
dan04

4
สิ่งนี้นำความทรงจำที่น่ากลัวกลับคืนมาจากโครงการเว็บแรกที่ฉันเข้าร่วม CGI เกตเวย์ไปยังโค้ด C ฉันยังสั่นเมื่อคิดถึงมัน! :-)
Brian Knoblauch

คำตอบ:


56

อย่างแน่นอน

มีเฟรมเวิร์กมากมายสำหรับการพัฒนารวมถึงWt , cppcms , CSPและอื่น ๆ การติดตั้งใช้งานอย่างรวดเร็วของ FastCGI อยู่ใน C และรองรับหลายภาษาโดยตรงรวมถึง C ++

ภาษาการเขียนโปรแกรมใด ๆ ที่สามารถแยกสตริงสามารถใช้ใน CGI หรือ servlet ภาษาใด ๆ ที่สามารถใช้การเชื่อมโยงกับไลบรารี C สามารถใช้ในการพัฒนาโมดูลสำหรับเซิร์ฟเวอร์ ISAPI หรือ Apache ที่เข้ากันได้

ไม่ใช่เรื่องง่ายโดยเฉพาะอย่างยิ่งใน C ++ และเอ็นจิ้น templating ที่ดีนั้นอยู่ห่างออกไปไม่มาก แต่ก็สามารถทำได้

แน่นอนว่าคำถามนี้เป็นความคิดที่ดีหรือไม่เป็นอีกเรื่องหนึ่งโดยสิ้นเชิง :)

หมายเหตุ:เว็บไซต์สำคัญ ๆ เช่น Amazon.com, eBay และ Google ใช้ C ++ สำหรับบางส่วนของโครงสร้างพื้นฐาน อย่างไรก็ตามจงตระหนักว่า Google ใช้ C ++ สำหรับระบบที่มีความเร็วสูงเท่านั้นและ Amazon.com เพิ่งจะเปลี่ยนจาก Lisp (ซึ่งทำให้เจ้าหน้าที่ระดับสูงของพวกเขาโกรธมาก :)

ก่อนหน้านี้ Facebook รวบรวม PHP เป็น C ++ แต่คอมไพเลอร์ HipHop ของพวกเขา (เขียนบางส่วนใน C ++) นั้นได้รับการดัดแปลงเป็นเครื่องเสมือนของ bytecode


2
+1 สำหรับการอ้างอิงกรอบต่าง ๆ คุณควรเพิ่มว่าเป็นเรื่องปกติสำหรับแอพพลิเคชั่นเว็บขนาดใหญ่ที่ให้พลังงานโดย c ++ (และภาษาอื่น ๆ ): amazon.com, google.com, ตอนนี้ facebook.com ผ่าน hiphop และอื่น ๆ
Kaim

7
@Klaim: มันเป็นเรื่องธรรมดา แต่มันก็ไม่ได้เป็นกฎ สถาปัตยกรรมของอเมซอนนั้นมีพื้นฐานมาจากเสียงกระเพื่อมและเพิ่งเขียนใหม่ใน C ++ เท่านั้น สถาปัตยกรรมของ Google เกี่ยวข้องกับ Java, Python และอื่น ๆ เกือบจะเป็น C ++ ด้วยเหตุผลหลายประการ Facebook ใช้ hiphop ตอนนี้เท่านั้นเพราะพวกเขาพบว่า PHP ไม่ได้ขยายขนาด :)
greyfade

4
ฉันเห็นด้วย แต่ฉันหมายความว่าพวกเขายังคงเป็นตัวอย่างที่รู้จักกันดีของการใช้ C ++ - เพื่อตอบคำถามชื่อเดิมโดยตรง
Klaim

1
@johannes ปัญหาการปรับขนาดของ Facebook เกิดจากความจริงที่ว่าพวกเขาจำเป็นต้องรักษาลำดับความสำคัญของเซิร์ฟเวอร์มากกว่าที่จำเป็นโดยเฉพาะอย่างยิ่งเนื่องจากประสิทธิภาพที่ไม่ดีของสคริปต์ PHP ที่ปรับให้เหมาะสม การปรับสเกลเชิงเส้นนั้นไม่ดีพอสำหรับโครงสร้างพื้นฐานขนาดใหญ่ แต่จำไว้ว่าวิธีการ "ไม่มีอะไรที่ใช้ร่วมกัน" นั้นไม่ได้ จำกัด เฉพาะ PHP C และ C ++ ก็สามารถทำได้เช่นกัน
greyfade

1
@amar สิ่งที่มีผลตอบแทนเล็กน้อยยกเว้นใน 0.1% ของแอพที่ต้องการประสิทธิภาพที่ดิบ คุณสามารถให้บริการใน 1/3 ของเวลาในภาษาอื่น ๆ ส่วนใหญ่ด้วยการสนับสนุนเว็บสแต็คที่ดี ธนาคารผู้ลงโฆษณาบนเว็บและอื่น ๆ ทั้งหมดให้บริการที่กว้างขวางโดยไม่ต้องใช้ C ++ แม้แต่ Facebook พูดเบาและรวดเร็ว StackOverflow ทั้งหมดทำในภาษาระดับสูงกว่า มันอยู่ที่นี่ แต่มันจะไม่กลายเป็นเสียงส่วนใหญ่อีกครั้ง อาจเป็นไปได้เลยทีเดียว
Rig

18

ทำไมไม่

OkCupidเว็บไซต์หาคู่ที่ถูกสร้างขึ้นด้วยภาษา C ++ อาจมีตัวอย่างอื่น ๆ

นอกจากนี้ยังมีเครื่องมือ Qt แรงบันดาลใจในการพัฒนาโปรแกรมเว็บด้วยภาษา C ++ เรียกน้ำหนัก


11
"ทำไมไม่ " เพราะการใช้ภาษานั้นง่ายกว่ามากสำหรับการสนับสนุนสิ่งนี้
เอ็ดเอส

5
@Ed S. ในขณะที่ฉันและ greyfade ชี้ให้เห็นว่ามีกรอบสำหรับการพัฒนาเว็บแอปพลิเคชันด้วย C ++
Vitor Py

2
ใช่ แต่อีกครั้งพวกเขาใช้งานง่ายเหมือนกรอบที่ใช้กันทั่วไปมากกว่านี้หรือไม่? ฉันถามด้วยความสัตย์จริงฉันไม่ใช่นักพัฒนาเว็บและฉันไม่เคยใช้มัน แต่มีบางอย่างบอกฉันว่าพวกเขามีแนวโน้มที่จะไม่เป็นผู้ใหญ่หรือใช้กันอย่างแพร่หลาย (เช่น) คู่ของทับทิม / หลาม / PHP
Ed S.

3
@EdS .: ทั้ง Ruby และ Python ไม่ได้เริ่มด้วยเฟรมเวิร์กเว็บ ในความเป็นจริงมันใช้เวลาทศวรรษที่ผ่านมาสำหรับผู้ที่จะปรากฏ เฟรมเวิร์กเป็นผลมาจากผู้คนจำนวนมากที่ต้องการใช้ภาษา X สำหรับปัญหา Y สิ่งเดียวกันอาจเกิดขึ้นสำหรับ C ++ สาเหตุหลักที่ทำให้มันไม่ได้: C ++ ไม่ได้รับการจัดการใช้เวลาในการรวบรวมและมีกำแพงกั้นทางเข้าที่สูงกว่าโดยทั่วไป
back2dos

1
@ back2dos: ใครบอกว่าทั้งสองภาษาได้รับการพัฒนาโดยคำนึงถึงเว็บเป็นหลัก? ฉันไม่ได้อย่างแน่นอน ฉันใช้คำว่า "สนับสนุน"
Ed S.

11

หากคุณวางแผนที่จะเขียนเว็บแอปพลิเคชันของคุณใน C ++ มันจะเป็นการสิ้นเปลืองโดยสิ้นเชิง

ข้อเสนอแนะของฉันคือการสร้างแบบอะซิงโครนัสโดยใช้ASIO (Asynchronous I / O) เมื่อคุณสามารถสร้างบริการบนเว็บที่รวดเร็ว (รวมกับnginx เป็น reverse-proxyและเซิร์ฟเวอร์สถิตสำหรับเอฟเฟกต์ที่ดีที่สุด); รวมเข้ากับเทมเพลตไลบรารีเช่นWtและคุณพร้อมที่จะให้บริการคำขอนับหมื่นต่อวินาทีจากเซิร์ฟเวอร์เดียว

ไม่ว่าจะเป็นทางเลือกที่ใช้ประโยชน์ได้จริงกับกรอบงานเว็บภาษาแบบไดนามิกหรือไม่


9

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

ในทางเทคนิคภาษาใด ๆ สามารถใช้เป็นสคริปต์ CGI ที่จัดเตรียมไว้ให้:

  1. ตีความอินพุตและสภาพแวดล้อมทั้งหมดตามที่แสดงโดยเซิร์ฟเวอร์
  2. เอาต์พุตในภาษามาร์กอัปที่รู้จัก (โดยทั่วไปคือ html)
  3. สามารถเรียกใช้โดยเซิร์ฟเวอร์

นอกจากนี้ยังมีวิธีอื่นด้วย Perl มีความสามารถในการสร้างเป็น wrapper รอบรหัส c / c ++ ทำหน้าที่เป็นเลเยอร์ตีความระหว่างสอง (และนี่ไม่รวมถึงโมดูล perl ที่เรียบเรียงเป็น C)


7

ในตอนแรกมันเป็นเรื่องธรรมดา - เว็บไซต์แรกที่ฉันทำงานในช่วงปลายปี 1990 คือส่วนขยายของ ISAPI ที่เขียนใน C ++ และพวกเขาทำงานได้ค่อนข้างดี


3
isapi.dll ทุกคน?
ดินสีแดง

หรือ ATLServer - atlserver.codeplex.com
gbjbaanb

5

ดูเหมือนว่า Microsoft จะคิดเช่นกัน ลองดูคาซาบลังก้าซึ่งเป็นชุดเครื่องมือใหม่สำหรับ (ปรากฏ) Azure โดยใช้ C ++

Casablanca เป็นโครงการที่จะเริ่มสำรวจวิธีการที่ดีที่สุดในการสนับสนุนนักพัฒนา C ++ ที่ต้องการใช้ประโยชน์จากการเปลี่ยนแปลงครั้งใหญ่ในสถาปัตยกรรมซอฟต์แวร์ที่ cloud computing เป็นตัวแทน

นี่คือสิ่งที่คุณจะได้รับจาก Casablanca:

  • รองรับการเข้าถึงบริการ REST จากรหัสเนทีฟบน Windows Vista, Windows 7 และ Windows 8 Consumer Preview โดยจัดเตรียมการเชื่อมโยง C ++ แบบอะซิงโครนัสกับ HTTP, JSON และ URIs
  • SDK ส่วนขยายของ Visual Studio เพื่อช่วยคุณเขียนโค้ดฝั่งไคลเอ็นต์ HTTP ของ C ++ ในแอพสไตล์ Metro Windows 8 ของคุณ
  • รองรับการเขียนโค้ดเนทีฟ REST สำหรับ Azure รวมถึงการรวม Visual Studio
  • ไลบรารีที่สะดวกสำหรับการเข้าถึง Azure blob และหน่วยเก็บข้อมูลคิวจากไคลเอ็นต์เนทีฟเป็นฟีเจอร์ Platform-as-a-Service (PaaS) ชั้นหนึ่ง
  • รูปแบบที่สอดคล้องและทรงพลังสำหรับการเขียนการดำเนินการแบบอะซิงโครนัสตามคุณสมบัติ C ++ 11
  • การใช้งาน C ++ ของโมเดลการเขียนโปรแกรมที่อิงกับนักแสดง Erlang
  • ชุดตัวอย่างและเอกสารประกอบ

2

สำหรับ PHP คุณสามารถเขียนส่วนขยาย C / C ++ ของคุณเองและรับประโยชน์จากประสิทธิภาพที่ดีในแบบนั้น ถ้าฉันมีส่วน CPU จริง ๆ ของเว็บแอปพลิเคชันของฉันฉันอาจจะทำไลบรารี C ++ ขนาดเล็กที่ลดการประมวลผลนั้นลงในส่วนขยายแล้วส่งคืนผลลัพธ์กลับไปที่ PHP แล้ว PHP ก็ส่งไปยังเบราว์เซอร์

สิ่งอื่น ๆ ที่ผู้คนมักไม่พิจารณาคือการลดการประมวลผล CPU บางอย่างไปยังฝั่งไคลเอ็นต์เช่น JavaScript / jQuery ถ้าฉันมีเว็บเซิร์ฟเวอร์ฉันอาจต้องใช้ซีพียู 3Ghz เพื่อทำการประมวลผลอย่างเข้มข้นสำหรับฟังก์ชั่นเฉพาะ (อาจเป็นการประมวลผลข้อมูลบางอย่าง) บริษัท ของฉันจ่ายเงินสำหรับเซิร์ฟเวอร์นั้นในแต่ละเดือนเพื่อให้มันทำงานต่อไป ถ้าฉันต้องการขยายการดำเนินงานสำหรับผู้ใช้งานพร้อมกัน 100 คนที่ใช้งาน CPU มากในเวลาเดียวกันบางทีฉันอาจต้องการซีพียูและเซิร์ฟเวอร์หลายเครื่องซึ่งเป็นการเพิ่มต้นทุนให้กับธุรกิจของฉัน ถ้าฉันลดภาระงาน CPU มาก ๆ ไปยังฝั่งไคลเอ็นต์ผู้ใช้แต่ละคนที่เข้าชมเว็บไซต์สามารถทำการประมวลผลข้อมูลของตัวเองและฉันไม่จำเป็นต้องเพิ่มความสามารถของเซิร์ฟเวอร์ดังนั้นจึงช่วยประหยัดเงินให้ฉันได้

ท้ายที่สุดด้วยพลังรวมกว่า 100 เดสก์ท็อป / แท็บเล็ต / โทรศัพท์มือถือที่ทำการประมวลผลสำหรับคุณนั่นคือพลังมากกว่าเซิร์ฟเวอร์ของคุณนั่งอยู่ในดาต้าเซ็นเตอร์ที่ใดที่ต้องเสียเงินเพื่อทำธุรกิจในแต่ละเดือน อาจเป็นไปได้ว่าเซิร์ฟเวอร์ทั้งหมดของคุณกำลังทำข้อมูลการดึงข้อมูลจากฐานข้อมูลการให้บริการเนื้อหาและการประมวลผลก่อน / หลังและการตรวจสอบความถูกต้องของข้อมูลก่อนที่จะจัดเก็บในฐานข้อมูล เห็นได้ชัดว่าคุณจะไม่สร้างรหัสฝั่งไคลเอ็นต์ด้วย CPU ที่มากเกินไปซึ่งอาจบล็อก / ตรึง UI ของเว็บเบราว์เซอร์คุณอาจปิดการร้องขอ AJAX ไปยังเซิร์ฟเวอร์ดึงข้อมูลแล้วประมวลผลข้อมูลแบบอะซิงโครนัสฝั่งไคลเอ็นต์ออกจากเว็บ -browser UI ใช้งานได้อย่างสมบูรณ์


2

ใช่มันสามารถใช้งานได้ คนอื่น ๆ ได้กล่าวถึงวิธีการต่างๆ นี่คือแนวทางของฉันเอง ข้อดีคือมันเป็นแบบพกพาและอยู่ในตัวเองห้องสมุดที่เลือกทั้งหมดขึ้นอยู่กับ ANSI C เท่านั้นการตั้งค่าต้องใช้เคอร์เนล Linux และคอมไพเลอร์ C (และสิ่งที่ชัดเจนเช่น Busybox, ทุบตี ฯลฯ ) (หรือ Windows และคอมไพเลอร์) ไม่จำเป็นต้องใช้ไลบรารีเพิ่มเติมไม่มีการติดตั้งขนาดใหญ่แฟนซี

ผลที่ได้คือโปรแกรมเดียวซึ่งเป็นทั้งเว็บเซิร์ฟเวอร์และตัวสร้างหน้าแบบไดนามิก (ทดแทนทั้ง "apache" และ "php") มันจะมีการเข้าถึงฐานข้อมูลผ่าน sqlite

ห้องสมุดที่ใช้:

  • พังพอน - เซิร์ฟเวอร์ HTTP
  • Sqlite - ฐานข้อมูล SQL
  • MiniXML - ทำให้การสร้างเพจแบบไดนามิกง่ายขึ้น ประเภทของ JavascriptcreateElement

ส่วนที่เหลือของคำตอบนี้เป็นคู่มือการตั้งค่าที่สมบูรณ์สำหรับ Linux ทั้ง SQlite และ MiniXML เป็นทางเลือก แต่คู่มือครอบคลุมการติดตั้งแบบเต็ม มันขึ้นอยู่กับคุณที่จะแสดงความคิดเห็นชิ้นส่วนที่ไม่จำเป็นหากคุณสนใจที่จะปิดการใช้งาน sqlite หรือ MiniXML

1. ดาวน์โหลด 3 ไลบรารี

2. เตรียมโฟลเดอร์ของคุณ

  • สร้างโฟลเดอร์ว่าง (เราจะเรียกมันว่าโฟลเดอร์หลัก)
  • วางไฟล์ต่อไปนี้ลงไป:
    • จาก sqlite tar.gz: sqlite3.c , sqlite3.h
    • จากพังพอนซิป: mongoose.c , mongoose.h
    • จาก mxml tar.gz: mxml.h

3. รวบรวม mxml

คุณอาจสังเกตว่า mxml.c หายไปนี่เป็นเพราะเราจำเป็นต้องสร้างไลบรารี mxml แบบคงที่ ไปที่โฟลเดอร์ที่ดาวน์โหลด mxml tar.gz และทำงาน:

tar -xvf mxml-<version>.tar.gz #Extract the tar
cd mxml-<version> #Go to the newly extracted directory
./configure #prepare the compiler
make #compile, you may need to install "make" first.

เมื่อการรวบรวมเสร็จสิ้นไฟล์จำนวนมากจะถูกสร้างขึ้นไฟล์เดียวที่เราสนใจคือlibmxml.aคัดลอกไฟล์นั้นไปไว้ในโฟลเดอร์หลัก

3.1 Doublecheck

ตรวจสอบว่าโฟลเดอร์หลักมีดังต่อไปนี้:

  • สำหรับพังพอน: mongoose.c, mongoose.h
  • สำหรับ mxml: libmxml.a, mxml.h
  • สำหรับ sqlite: sqlite.c, sqlite.h

4. main.c

มาสร้างโปรแกรมจริงสร้างmain.cไฟล์ในโฟลเดอร์หลักต่อไปนี้เป็นโครงกระดูกสำหรับคุณในการเริ่มต้น

#include <string.h>
#include <stdio.h>

#include "mongoose.h"
#include "mxml.h"
#include "sqlite3.h"

/***Sqlite initialization stuff***/
//comment out everything sqlite related if you don't want sqlite, including the callback function and the include "sqlite3.h"
static int callback(void * custom, int argc, char **argv, char **azColName);
char *zErrMsg = 0;
sqlite3 *db;
int rc;

/***Just some laziness shortcut functions I made***/
typedef mxml_node_t * dom; //type "dom" instead of "mxml_node_t *"
#define c mxmlNewElement   //type "c" instead of "mxmlNewElement"
inline void t(dom parent,const char *string) //etc
{
    mxmlNewText(parent, 0, string);
}

//type "sa" instead of "mxmlElementSetAttr"
inline void sa(dom element,const char * attribute,const char * value) 
{
    mxmlElementSetAttr(element,attribute,value);
}




//The only non boilerplate code around in this program is this function
void serve_hello_page(struct mg_connection *conn)
{
    char output[1000];
    mg_send_header(conn,"Content-Type","text/html; charset=utf-8");
    mg_printf_data(conn, "%s", "<!DOCTYPE html>");
    //This literally prints into the html document


    /*Let's generate some html, we could have avoided the
     * xml parser and just spat out pure html with mg_printf_data
     * e.g. mg_printF_data(conn,"%s", "<html>hello</html>") */

    //...But xml is cleaner, here we go:
            dom html=mxmlNewElement(MXML_NO_PARENT,"html");
                dom head=c(html,"head");
                    dom meta=c(head,"meta");
                    sa(meta,"charset","utf-8");
                dom body=c(html,"body");
                    t(body,"Hello, world<<"); //The < is auto escaped, neat!
                    c(body,"br");
                    t(body,"Fred ate bred");    
                dom table=c(body,"table");
                sa(table,"border","1");

                //populate the table via sqlite
                rc = sqlite3_exec(db, "SELECT * from myCoolTable", callback, table, &zErrMsg);
                if( rc!=SQLITE_OK )
                {
                    fprintf(stderr, "SQL error: %s\n", zErrMsg);
                    sqlite3_free(zErrMsg);
                }

            mxmlSaveString (html,output,1000,  MXML_NO_CALLBACK);
            mg_printf_data(conn, "%s", output);
            mxmlDelete(html); 
}

//sqlite callback
static int callback(void * custom, int argc, char **argv, char **azColName)
{
    //this function is executed for each row
    dom table=(dom)custom;

    dom tr=c(table,"tr");
    dom td;
    int i;
    for(i=0; i<argc; i++)
    {
        td=c(tr,"td");
        if (argv[i])
            t(td, argv[i]);
        else
            t(td, "NULL");

        printf("%s == %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
     printf("\n");
     return 0;
}


static int event_handler(struct mg_connection *conn, enum mg_event ev)
{
    if (ev == MG_AUTH)
    {
        return MG_TRUE;   // Authorize all requests
    }
    else if (ev == MG_REQUEST)
    {
        if (!strcmp(conn->uri, "/hello"))
        {
            serve_hello_page(conn);
            return MG_TRUE;   // Mark as processed
        }
    }
    return MG_FALSE;  // Rest of the events are not processed

}

int main(void)
{
    struct mg_server *server = mg_create_server(NULL, event_handler);
    //mg_set_option(server, "document_root", "."); //prevent dir listing and auto file serving
    //TODO can I allow file listing without dir listing in a specified directory?
    mg_set_option(server, "listening_port", "8080");


    rc = sqlite3_open("db.sqlite3", &db); 

    if( rc )
    {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    printf("Server is running on port 8080!\n");
    for (;;)
    {
        mg_poll_server(server, 1000);  // Infinite loop, Ctrl-C to stop
    }
    mg_destroy_server(&server);
    sqlite3_close(db);

    return 0;
}




/*
 * useful stuff:
 * mg_send_file(struct mg_connection *, const char *path); - serve the file at *path*/

ในที่สุดก็รวบรวม!

รวบรวมกัน cdไปที่โฟลเดอร์หลักของคุณและดำเนินการเหล่านี้:

gcc -c main.c
gcc -c mongoose.c
gcc -c sqlite3.c
gcc -o server.out main.o mongoose.o sqlite3.o -ldl -lpthread -lmxml -L . 

ตอนนี้รัน server.out ด้วย/server.outและไปที่localhost:8080/hello

เสร็จแล้ว :)



@Hey: ขอบคุณที่ชี้ให้เห็นทางเลือกพังพอนนี้ฉันมักจะชอบโครงการที่ขับเคลื่อนด้วยชุมชน ฉันอาจจะแทนที่ Mongoose ด้วย Civetweb ในคำตอบของฉันหลังจากที่ฉันทดสอบอย่างละเอียด
สวัสดีชาวโลก

0

ฉันเดาว่าระบบฝังตัวหลายตัว (เช่นเราเตอร์เครื่องพิมพ์ ... ) มีเว็บเซิร์ฟเวอร์ที่ขับเคลื่อนด้วย C ++

โดยเฉพาะอย่างยิ่งคุณสามารถใช้ไลบรารีเซิร์ฟเวอร์ HTTP บางอย่างเช่นlibonionเพื่อเพิ่มความสามารถทางเว็บบางอย่างให้กับโปรแกรม C หรือ C ++ หรือเพื่อพัฒนาเซิร์ฟเวอร์ไฟที่มีเว็บอินเตอร์เฟสบางตัว

บางคนเขียนโปรแกรมเว็บเซิร์ฟเวอร์หรืออินเตอร์เฟซ HTTP ใน Ocaml ใช้ของพวกเขาOcsigen ไม่ใช่ทุกสิ่งในเว็บคือ PHP และด้วยFastCGIคุณสามารถประมวลผลเว็บแบบไดนามิกใน / กับแอปพลิเคชันของคุณ

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