tinyhttpd下载链接tinyhttpd
一.
socket就是插座(套接字),运行在计算机中的两个程序通过socket建立起一个通道,数据在通道中传输,分为流socket和数据报socket。
1.流socket基于TCP协议,双向字节流的通道,传输数据不会丢失、不会重复、顺序也不会错乱。提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。TCP协议面向连接,可靠的传输层协议,分段,重组,重传,滑动窗口,适用于对可靠性要求较高的场合。
2.数据报socket基于UDP协议,可能会丢失或错乱。对数据的长度有限制,但是它的速度比较高效率高。UDP协议不具有可靠性,不能保证消息一定会到达。无连接、不可靠的传输协议,花费的开销小,传输效率高。
3.比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。
在TCP/IP网络应用中,两个程序之间通信模式是客户/服务端模式(client/server)
二.
1、服务端的工作流程
1)创建服务端的socket。
2)把服务端用于通信的地址和端口绑定到socket上。
3)把socket设置为监听模式。
4)接受客户端的连接。
5)与客户端通信,接收客户端发过来的报文后,回复处理结果。
6)不断的重复第5)步,直到客户端断开连接。
7)关闭socket,释放资源。
2、客户端的工作流程
1)创建客户端的socket。
2)向服务器发起连接请求。
3)与服务端通信,发送一个报文后等待回复,然后再发下一个报文。
4)不断的重复第3)步,直到全部的数据被发送完。
5)第4步:关闭socket,释放资源。
先启动服务端程序server,服务端启动后,进入等待客户端连接状态,然后启动客户端,程序退出时先关闭socket
对服务端来说,有两个socket,一个是用于监听的socket,还有一个就是客户端连接成功后,由accept函数创建的用于与客户端收发报文的socket
关于send,recv,socket,gethostbyname,connect,blind,listen,accept函数自行查阅 网络编程大全网站
服务端函数调用的流程是:socket->bind->listen->accept->recv/send->close
客户端函数调用的流程是:socket->connect->send/recv->close
其中send/recv可以进行多次交互
总结TCP服务端编写步骤,如下:
- 调用socket函数创建套接字。
- 调用bind函数给创建的套接字命名,分配IP地址和端口。
- 调用listen函数进行监听,等待客户端连接。
- 调用accept函数接受新的连接,做好相互通信准备。
具体工作过程:
三.
先简单地解释每个函数的作用:
accept_request: 处理从套接字上监听到的一个 HTTP 请求,在这里可以很大一部分地体现服务器处理请求流程。
bad_request: 返回给客户端这是个错误请求,HTTP 状态吗 400 BAD REQUEST.
cat: 读取服务器上某个文件写到 socket 套接字。
cannot_execute: 主要处理发生在执行 cgi 程序时出现的错误。
error_die: 把错误信息写到 perror 并退出。
execute_cgi: 运行 cgi 程序的处理,也是个主要函数。
get_line: 读取套接字的一行,把回车换行等情况都统一为换行符结束。
headers: 把 HTTP 响应的头部写到套接字。
not_found: 主要处理找不到请求的文件时的情况。
sever_file: 调用 cat 把服务器文件返回给浏览器。
startup: 初始化 httpd 服务,包括建立套接字,绑定端口,进行监听等。
unimplemented: 返回给浏览器表明收到的 HTTP 请求所用的 method 不被支持。
四.编译运行
没有出现变换色彩的html页面是因为内部权限还没设置好,直接输出localhost:47625就可
期待修改完成:
增加修改文件权限
需要修改root的文件夹
还有来自队友cgi的修改还没完成呜呜