Tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。下载链接链接: LippiOuYang/Tinyhttpd · GitHub
TCP网络编程基本流程如下图所示:
由于本人网络编程方面知识接触的不够多,首先记录一下socket通信相关的函数和参数
1. int socket(int af,int type,int protocol); //建立一个socket用于连接:
af:即address family,地址族,通常设为AF_INET表示使用IP地址
type:连接类型,通常为SOCK_STREAM(流式套接字,如TCP)或DGRAM(数据报套接字,如UDP)
protocol:协议类型,通常是IPPROTO_TCP或IPPROTO_UDP,若不指定可设为0
返回值为socket的编号,若返回-1则表示建立socket失败
2. int setsockopt(int s, int level, int optname, const void * optval, ,socklen_t optlen); //设置socket状态
s:套接字的返回值
level:欲设置的网络层,此项目里设定的值为SOL_SOCKET
optname:欲设置的选项,此项目里设定的值为SO_REUSEADDR,允许在bind()过程中本地地址可重复使用
optval:欲设置的值
optlen:optval的长度
3. int accept(int socket,sockaddr * fromaddr,int * addrlen); //接收客户端连接请求,返回一个套接字
socket:用来监听的socket,即服务器socket
fromaddr:客户机地址
addrlen:地址结构体长度
http请求报文的格式如下:
httpd.c中的几个关键函数:
主函数(main):
int main(void)
{
int server_sock = -1; //服务器套接字
u_short port = 4000; //端口
int client_sock = -1; //客户端套接字
struct sockaddr_in client_name;
socklen_t client_name_len = sizeof(client_name);
pthread_t newthread; //线程ID
server_sock = startup(&port);
printf("httpd running on port %d\n", port);
while (1)
{
client_sock = accept(server_sock,
(struct sockaddr *)&client_name,
&clien