TinyHttpd源代码阅读

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值