如何在Linux上用C/C++编写Web服务器

40

我正在探索在Linux平台上开发一个小型(简陋的)Web服务器,但我不知道从何开始。

我希望它能够做到以下几点:

  • 监听特定端口
  • 接收HTTP POST和GET请求
  • 适当地响应请求
  • 不需要会话管理
  • 必须使用C或C ++编写
  • 必须作为服务在启动时运行

我熟悉HTTP头,并且是一名经验丰富的PHP和.NET Web开发人员,但我不确定该如何开始这项任务。

您能否向我提供一些资源来帮助我度过学习曲线?


在启动时运行与您的编程语言无关,您需要做的就是使其可运行为[程序名称] start并可停止为[程序名称] stop,然后将其安装到/ etc / init.d或/ etc / rc.d /或其他位置。 - Brendan Long
谢谢Brendan,你能解释一下(或提供链接)在这个上下文中你所说的“可运行”是什么意思吗? - Jack
Brendan 正试图解释一个 Unix 守护进程,它类似于 MS-Windows 下所称的服务。参考(含代码片段):http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html - mctylr
3
如果这个服务器需要面向互联网,你不应该自己编写。它一定会受到攻击。现有的HTTP服务器包含了许多经验教训。 - MSalters
1
我讨厌将这个关闭投票,因为编写一个简单的Web服务器是我在学校最喜欢的练习之一...唯一的方法就是直接开始 - 创建myserver.c,打开监听套接字,编译,运行,并将浏览器指向它。看看会发生什么。反复迭代。 - Andy Jones
6个回答

46

从上到下,你需要了解以下内容:

  • HTTP协议
  • TCP服务器 - BSD套接字编程
  • 编写基本的Unix守护程序(持久服务)
  • 进程管理(fork)
  • 解析文本(读取配置文本文件)
  • 文件处理(I/O)
  • 调试C/C++编程 :)

因此,您将需要学习编写基本的Unix应用程序,BSD套接字编程用于TCP/IP网络编程和HTTP协议。

常用文本包括:

Unix应用程序开发:

  • 《Unix环境高级编程》(Advanced Programming in the Unix Environment),Stevens & Rago
  • 《高级Unix编程》(Advanced Unix Programming)

TCP/IP (sockets) 编程:

  • 《Unix网络编程》(Unix Network Programming),第1卷 Stevens et al.
  • 《TCP/IP详解》(TCP/IP Illustrated),Stevens
  • 《TCP/IP卷3:TCP协议相关》(Ineternetworking with TCP/IP, Volume 3),Comer

HTTP协议

  • 包括RFC:
  • RFC 2616用于HTTP v1.1,
  • RFC 2068用于v1.1之前的版本
  • 根据支持(压缩,URI / URL)和完整性而定

严格来说,解析配置文件和分叉并不是必要的。 - Billy ONeal

21

对于一个简单/基础/超轻量级的HTTP服务器,程序流程应该像这样(伪代码):

----Main thread----
Load settings
while true do
    Wait for connection
    Connection received, create a new thread and transfer this connection to this thread.
end

----Connection thread----
Analyze request
if dynamic content do
    Dump the HTTP request and send it to the interpreter
    Wait for response from the interpreter
    Read response header from the interpreter
    Stream response
else if static content do
    Load requested file
    Stream file content
end
(Optional) Cache the response if size < X
Send the response
Close the socket

那么你应该学习Threading(线程),Interprocess-communication(进程间通信,如果你想与解释器交互),Socket编程和HTTP协议。


9

5
你可以从现有的代码库开始。boa可能是一个好的起点,因为它很小,用C实现,并适合你的“开机启动”要求;详细信息例如在Debian / Ubuntu软件包中。

3

链接无法使用。 - Austin

2
使用libevent库,您可以用40行C代码编写一个Web服务器。
如果您想从头开始创建它,那么可以参考像lighttpd、apache、nginx这样的用C编写的开源Web服务器。 http://www.ruilog.com/article/view/5249.html

损坏的链接。错误404。 - e-info128

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接