2.1.3 http服务器实现
-
目的
reactor应用——webserver webclient
每次上课前 看大纲+down code
-
复习:
不行啊 编译给的代码报错啊 给的最新的不是0430那一版就不行啊
reactor.c:(.text+0x254): relocation truncated to fit: R_X86_64_PC32 against symbol `begin' defined in COMMON section in /tmp/cctoLdtd.o
你学会了吗 小朋友 😆 git 拉取某一次的版本 我好棒成功了
git拉取历史提交的代码_git拉取某次提交的代码-CSDN博客
一开始clone下来
git clone .git
git log
查看某一日期的commitgit switch -c 名字
创建一个分支branchgit checkout 提交hash值
切换到某一次提交git switch main
又可以切回main分支 -
编译0427版本还是报错
https://blog.csdn.net/www_helloworld_com/article/details/88964968
gcc -mcmodel=medium -o reactor reactor.c
成功啦 send以后返回接收的数据
水平 边沿触发
-
水平:只要有数据 没读完前一直触发
-
边沿:有数据只触发一次,不管读完没
改accept cb里 默认水平lt,或一个epollet边沿触发
event_register(clientfd, EPOLLIN | EPOLLET);
改
bufferlength = 10
改小buffer 明显一点改recv_cb
if 1 里面 printf("[%d] RECV: %s\n", conn_list[fd].rlength, conn_list[fd].rbuffer); 把这一行注释掉,accept事件以后只有recv,没有epollout 没有再次预设事件 // set_event(fd, EPOLLOUT, 0);
效果
ET边沿触发 只触发一次,一段段recv,配套while
你妈喊你吃饭,一直喊喊道答应为止
每次client send32 byte
每次server 收buffer 10
1串字符32byte 要四次,所以要按四次send servervscode里才收的完!!!!
LT水平触发——触发四次,不需要while 全自动
你妈喊你吃饭直喊一次,全自动不再喊等到你来
client网络助手里send一次,vscode的server端一次性跳出来4行,就是边沿要四次才能收到的数
为什么有奇奇怪怪的结尾,因为没有memset清空
何时用LT ET
非阻塞IO用边沿触发,因为如果阻塞io,进入while会卡住,不recv了,所以非阻塞io用边沿触发好
**水平触发:适合包大小固定的,**多个client 连listenfd 然后server调用accept
边沿:适合每个包大小不确定的,while加accept()直到accept(返回-1 不读了