Monthly Archives: December 2017

好怀念高三

高三的时候告诉自己当前主要任务是读书,所以每次要学到很晚的时候就很有可能去吃个夜宵,然后读书就特别幸福

现在上了大学有了减肥的需求,每次晚餐稍稍早吃/少吃一点就会在晚上12点后特别的饿orz

然后还不能吃夜宵orz

赶在死线之前!

嘿嘿,之前说是尽量每天更新关于JZHTTPD的编写,但每次不是因为数学作业太多就没有写,就是因为写的太投入,一写写好久导致最后没时间来写Blog。

今天下午是交作业的Deadline,我赶在中午的时候把JZHTTPD的雏形终于写好了,现在来Blog上填坑。

首先代码都可以在Github 上看到

因为在写的时候有不少参考了github上的tinyhttpd ,所以和它有点神似之处。。

先从serverStartup这个函数讲起,要能达到和用户机(client)建立连接的目的,我们首先要在服务器上开创一个套接字socket,所有的数据传输都通过socket完成,新建socket,需要用到函数socket(AF_INET,SOCK_STREAM, 0);在这里AF_INET表示使用的是iPv4协议,SOCK_STREAM表示是数据流传输,其他参数可通过man(Linux 中)查看(接下来要讲到的函数也一样)。这个函数返回一个整形作为我们新建的socket的标识符,之后每次在其他函数中调用这个socket,传入这个返回值就可以(因此我们需要声明一个int来接收这个返回值)。

2017/12/26


接下来,我们通过sockaddr_in 这个struct 来对我们的建立好的socket进行一些设置,比如说,设置端口,其中设置端口的时候我们需要使用htons()这个宏函数将我们的端口号改成网络字节顺序(因为不同的计算机对数据的存储方式不同,有的是高位在低位的左边,有的是高位在低位的右边)。接着用setsockopt 这个函数对socket进行一些设置,具体参数可以参见man手册或去Google,然后分别调用bind 和 listen绑定与建立监听,其中listen函数的第二个参数指明的是允许等待的连接数。这样,我们启动服务的过程就完成了,我们将这个socket的表示符作为返回值返回,并正在主函数中接受它。

接下来我们使用accept函数来接受用户的连接请求,因为我们的服务需要允许(不同用户)用户的多次连接,所以将accept放在while循环里面,该函数返回值为一个socket处理代码,之后每次数据传输由该socket处理。

建立连接后,通过recv函数读取用户的http request。并调用acceptRequest函数来处理它。因为我们需要对特定socket进行操作,该函数应该要接收两个参数,一个是int型的,用来指明数据往哪传,一个是char* 型,用来存放用户的请求信息。

一个http 请求的开始两个单词分别是请求的method 和 请求的路径。作为一个最简单的httpd服务器,我们也最(只)关心这两个东西。所以我们在处理请求的时候分别将它俩读入method字符串和url字符串中,对后面的请求信息就直接无视了。

读入后,我们首先要判断请求的方法是否为get,如果不是,那么就要告诉用户你请求的方法我们没有实现,具体是直接调用unimplemented()这个函数实现的,这个函数仿照了tinyhttpd中的方法,新建了一个字符串, 直接在程序中向它写入html代码,并通过write函数写给用户。

如果方法是get,那么我们就要从服务器上找到用户请求的文件返回给用户,如果用户请求的末位是”/”,也就是说用户没有指明请求什么文件(这种情况很常见,比如你在访问本Blog的时候,你访问的是www.jerry.com 而不是www.jerrypoi.com/index.php),因此,如果用户的访问最后结尾的是/,我们就要给它加上(默认)index.html,加上后,我们用sprintf这个函数,将默认html代码存储路径+url字符串 赋给path,并调用fopen打开path,如果打开失败,那么就是404 notfound,这时调用notfound函数告诉用户notfound,notfound实现方法和unimplemented()函数实现方法相同。

如果打开成功,调用header 来写http response的头,这时的状态码应该是200,然后调用sendFile将打开的文件发给用户。这就是整个JZHTTPD的运行原理了,如果你喜欢我的讲解,欢迎移步Github 点赞:)

问一个问题

读者朋友你觉得现在这个blog的域名:jerrypoi.xyz 和 jerrypoi.com 相比咋样,最近我的域名供应商万网给我发邮件要求我实名认证jerrypoi.xyz 这个域名,否则就会Server Hold 无法解析,因此我在考虑将域名转出万网,在godaddy浏览的时候发现.com域名只要58…这个价格在可以接受的范围内,那么要不要买呢?