前言:
近期学习了服务器相关的开发,平常主要撸c的程序,所以就下定决心研究了c的服务器开发,目的也在与巩固c的基本知识。详细分享如下,若有错误请指正,希望与大家探讨,共同学习进步。
(服务器搭建的框架)
一、关于http协议和xined服务
1. HTTP协议大致解析(概念就不在抄袭了):
请求服务器数据:
(1) GET /文件或目录 HTTP/1.1
(2) 协议头部分 (可选)
(3)\r\n(协议头结束)
服务器应答浏览器:
(1)HTTP/1.1 200 OK
(2)content-Type:回写客户端的数据的类型
(3)content-Length:回写文件的长度(确保正确性,不然会无法显示文件)
(4) \r\n(协议头结束)
(5)回应带数据包
2.HTTP常见的状态码和方法定义补充:
常见状态码:
(1)1xx:临时响应并需要请求者继续执行操作
(2)2xx:成功处理了请求的状态码
(3)3xx:需要进一步操作,重定向
(4)4xx:请求错误,妨碍了服务器的处理
(5)5xx:服务器在尝试处理请求是发生内部错误
方法定义:
OPTIONS(返回服务器针对特定资源所支持的http的请求方法),
HEAD(向服务器索要与GET请求相一致的响应,响应体将不会被返回,
可以在不必传输整个响应内容的情况下,获取响应消息头中的元信息),
GET(向特定资源发出请求),
POST(向指定资源提交数据进行处理请求),
PUT(向指定资源位置上传其最新内容),
DELETEL(请求删除操作所标识的资源),
TRACE(回显服务器收到的请求,诊断或测试),
CONNECTHTTP/1.1(预留将连接改为管道方式的代理服务器)
3. xinetd 守护进程:
daemon系统中的一个后台程序,周期性做的执行耨写任务,等待某个shijian事件的发生,
不会随用户的注销而退出。
创建守护进程:fork子进程,父进程结束,子进程setsid()脱离控制终端,修改权限文件描
述符,重定向dup2()
4. xinetd安装,配置:
(1)在线安装: sudo apt-get install xinetd
(2)判断安装是否成功:sudo aptitude show xinetd
(3)配置:sudo vi /etc/xinetd.d/xhttpd (注意三个统一)
sevice xhttpd
{
socket_type = stream (网络套接字类型:流或者数据包)
protocol = tcp (ip协议,tcp,udp)
wait = no (取值 y?n)
user = nobody (运行进程的用户ID)
server = /home/hao/xhttpd (执行的完整路径)
server_args = /home/hao/file_dir (传递给server的值)
disable = no (用于默认的{}中禁止服务)
flags = IPv4 (所使用的互联网协议)
}
(4) sudo vi /etc/services 在其中加入端口号(注意端口号不能与系统重用)
xhttpd 8000/tcp #serverxhttpd 8000/udp #server
(5) 重启xinetd 服务器 sudo service xinetd restart
(6) 查看运行状态 ps aux | grep xinetd
5. 分析xhttpd服务器实现功能:
xinetd 在启动 xhttpd 可执行文件时,传入参数argv[1]---》配置文件server_args的值
eg:./xhttpd /home/hao/dir/photo.jpg
chdir();改变工作目录 ---》 拼接 访问文件的绝对路径访问
读取 http的协议头,解析出请求的文件名
标准输入中读取,
得到请求文件名或者目录
判断文件是否存在:
存在:
判断待请求文件是什么类型:(1)目录:返回目录列表,寻求对应的文件名称
(2)文件:写回应http协议头 回写文件内容
----------------------------------------------------------------------------------------------------------
<下节: 关于具体代码xhttp执行文件的代码详解>