Java Spring 计算机网络 cmd dns get grep textview jestjs jaxb mockito vue插件 admin框架 seo教程下载 多店版微信商城 jquery去空格 bootstrap时间轴 java 数据分析 webapp打包 配置tomcat环境变量 python如何注释 pythonfor循环 java编程 java覆盖 java数据结构 java数组添加元素 java查看数据类型 java文件路径 python网站开发实例 易语言进度条 火牛软件 stata软件 销售单软件 端口关闭工具 js转int vue上传文件 wine模拟器 矩阵分析与应用 美国地址生成器 git命令 小米8游戏模式
当前位置: 首页 > 学习教程  > 编程语言

Linux网络编程(web服务器)

2020/8/31 16:05:28 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录

    • web服务器总体介绍:

web服务器总体介绍:

使用浏览器作为客户端访问web服务器;

使用到的知识:
  socket编程:
    socket setsockopt bind listen read write send recv close

编写网络服务器常用的模型有哪些:
  多进程版本,
  多线程版本
  多路IO复用:select poll epoll
  第三方库: libevent

TCP/IP四层模型:
  应用层—>传输层---->网络层---->数据链路层

本次案例所使用的协议:
  TCP+http协议
  http协议的请求和应答协议.
  html文件的编写

TCP协议重在数据的传输, 而http协议重在数据的解释

http协议请求报文格式:
1. 请求行 GET /test.txt HTTP/1.1
2. 请求行 健值对
3. 空行 \r\n
4. 数据

http协议响应消息格式:
1. 状态行 200 表示成功, 404 表示请求的资源不存在
2. 消息报头 健值对
3. 空行 \r\n
4. 响应正文

选择使用epoll模型作为web服务器:
1 创建socket
2 设置端口复用
3 绑定
4 监听
5 创建epoll树
6 将监听文件描述符上epoll树
7 while(1)
{
nready = epoll_wait();
if(nready<0)
{

}

for(i=0; i<nready; i++)
{
  	//若是有新的客户端连接到来,则接受新的客户端连接, 然后上epoll树
  	if(lfd==events[i].data.fd)
  	{
  		cfd = accept();
  		epoll_ctl(epfd, cfd, EPOLL_CTL_ADD, &ev);
  	}
  	else
  	{ 	
  		http_request(cfd);
  	}
}

}

//处理客户端的请求
int http_request(int cfd)
{
//读取数据
//先读取一行, 可以获得浏览器想请求的文件
//然后循环将剩余的数据读完

//查看本地是否有这个文件
	---若没有这个文件, 则组织应答信息并且将404.jpg文件内容发送给浏览器
	---若有个这个文件, 则判断文件类型
		----若是普通文件, 则组织应答消息并且将文件内容发送给浏览器
		----若是目录, 则组织应答消息, 响应正文部分将目录下的所有文件组织
		成文件列表的形式生成html文件(每个文件都是一个超连接), 然后发送给浏览器 

}

read函数读通信文件描述符是阻塞的, 所以在while中循环读的时候若读完数据了会引起阻塞;
所以应该将通信文件描述符设置为非阻塞.

char *path = getenv(“HOME”);

遍历目录的函数:
1 opendir readdir closedir
2
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(void)
{
struct dirent **namelist;
int n;

n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror(“scandir”);
else {
while (n–) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}

Index of ./

Index of ./

    <--文件列表部分-->
  • filename
xhttpd

SIGPIPE信号的产生: 若服务端传输数据的时候, 浏览器连接关闭, 此时由于是正在写一个
没有读端的连接, 此时内核会给web服务端发送SIGPIPE信号.

%E8%8B%A6%E7%93%9C.txt
e8 8b a6 e7 93 9c

e8---->e8

‘A’—>10
‘A’-‘A’+10
‘C’- ‘A’+10 = 12

(‘e’ - ‘a’ + 10)*16 + (‘8’-‘0’)

公式为c: r
if(c>=‘0’ && c<=‘9’)
{
r = c-‘0’;
}
else if(c>=‘A’ && c<=‘F’)
{
r = c-‘A’ + 10;
}
else ifif(c>=‘a’ && c<=‘f’)
{
r = c-‘a’ + 10;
}

ff—>15*16+15=255

网络编程部分整体回顾:
1 协议的概念
2 OSI7层模型: 物数网传会表应
3 TCP/IP四层模型: 应用层 传输层 网络层 数据链路层
4 几种常见的协议格式, TCP UDP ARP IP
5 socket API编程:
网络字节序 主机字节序
字节序常用到的函数: htons htonl ntohs ntohl
IP地址转换函数: inet_pton inet_ntop
INADDR_ANY
socket API常用的函数:
socket bind listen accept connect read | recv send|write close setsockopt
编写简单版本的服务端程序和客户端程序的流程:

5 三次握手和四次挥手 滑动窗口
TCP 状态转换图
半关闭: close和shutdown的区别
心跳包
同步和异步
阻塞和非阻塞
6 高并发服务器模型:
多进程版本
多线程版本
多路IO复用技术: select poll epoll (ET LT 边缘非阻塞模式)
epoll反应堆
线程池
UDP通信
本地socket通信
第三方库: libevent
事件驱动, 和epoll反应堆一样
普通事件
bufferevent
连接监听器
7 web服务端开发:
html语法
http协议: 请求消息格式 响应消息格式
web服务端开发流程:
libevent作为web服务框架的流程


本文链接:
http://www.dtmao.cc/news_show_150461.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?