0%

寄!

三次握手/四次挥手

client syn -> svr syn+ack -> client ack。

三次的原因:排除syn发出之后cli死掉的常见情况。
也有说法是:收syn时svr确认自己可以收cli可以发,收syn+ack时cli确认自己和svr可以收发,收ack时svr确认cli可以收自己可以发。

client fin -> svr ack | svr fin -> client ack. cli收到fin后等待2MSL,确保自己的ack没丢。(如果丢了svr会重发fin,cli得再给出回复。2MSL是自己ack+svr第二个fin的最长时间)。

网上一堆博客,然后又犯了觉得他们写不清楚的老毛病。

开一篇,也当复习了。所有内容依据网上博客整理,没自己读过源码。有错误请随意指出。

Select

1
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, timeval *timeout);

read, write, except对应需要监听相应事件的fds。

把需要监听的fd扔进fd_set(可以当作一个1024位的bitset)里面。有FD_ZEROFD_SETFD_ISSET几个宏管理fd_set

调用select时,对于fd_set每一个置1的位对应的fd,select先调用file_operations->poll判断文件是否满足监听条件,如果有满足的立刻返回。如果都不满足,把调用进程扔进的等待队列里,然后当前进程进入阻塞态。

select返回以后,fds和timeout被改写。需要用一个循环判断fds里面哪几位是1,然后用对应的fd读写。

pselect是select带一个sigmask的版本。大体是可以在进入pselect之后切换signal的屏蔽(e.g.原来屏蔽sigint,进去以后不屏蔽有特殊处理)。见https://stackoverflow.com/questions/46042794/how-does-pselect-blocks-signal-using-signal-mask-in-network-programming

Poll

1
2
3
4
5
6
int poll(pollfd *fds, nfds_t nfds, int timeout);
struct pollfd {
int fd; /* File descriptor to poll. */
short int events; /* Types of events poller cares about. */
short int revents; /* Types of events that actually occurred. */
};

显而易见。提前准备好fds数组,填好fd和events,poll结束之后revents会被os填好。

比select好的地方在于fds没有1024位的限制,并且支持更精细的event控制(有一堆宏)。缺点是pollfd *是数组,添加新的会...有很头疼的内存分配。提前开好比较大的空间的话,又会因为每次在用户态和内核态中间来回赋值导致耗费比较大。而且和select一样需要遍历所有fds(虽然会好一点点,可以跳过中间没有使用的fd)。

ppoll同pselect。

Epoll

1
2
3
4
5
6
7
8
int epoll_create(int size); // size is a hint for allocation. returns epfd.
int epoll_ctl(int epfd, int op, int fd, epoll_event *event); // op: add / del / modify
int epoll_wait(int epfd, epoll_event *events, int maxevents, int timeout)
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable. union for ptr or fd. */
};

epoll维护就绪队列rdlist链表,用于记录哪个fd就绪(不需遍历)。还维护一个红黑树map<fd, epoll_event>(实际还有些别的,只看接口的话可以看成这样)。(红黑树node和链表node共用,所以删的时候是一起删掉的)。

epoll_create打开一个需要close掉的fd用来维护epoll。这玩意和文件一样有等待队列,稍后用到。

epoll_ctl增删改epoll监听的fd。具体是把epoll本体添加到对应fd的等待队列里。fd对应的文件就绪时,把自己加进rdlist,然后让epoll就绪。此外,把fd->epoll_event的关系添加进红黑树,方便在fd就绪时查找对应的节点。

调用epoll_wait时如果rdlist非空立刻返回,为空则阻塞,并把当前进程加入epoll的等待队列,epoll就绪时返回。返回时需要分配一段内存放copy过来的epoll_event。

看了一点源码,红黑树里面装的epoll_event是epoll_ctl设置的原始值。epoll_wait返回时,会往传入的event里面copy一份原始值,然后去到fd对应的文件里拿真正发生的events做一个and。

aio

没看。目前在linux的实现貌似不全面而且有问题?反正是给kernel提供一块user space的空间,kernel把东西全搞定以后发通知回来。

记录一些c艹问题。

rvalue ref是左值

参透了一切...

xvalue几乎是人为规定的。一个value以后弃用了,但还没到destory的时候可以称为xvalue。

那么,xvalue作为一个左值,我们希望编译器把它当作右值看,回收掉有用的部分。

How?reinterpret_cast<T &&>()

所以rvalue ref是一个左值,表明你这个scope里持有这个对象的所有权。但是,它在给人一个提示:它应该过会被当作右值处理,外面的东西已经不管它了。

还可以从生命周期的角度...只要把move当作关键字看,一切都合理了起来。

1
2
3
4
T &&rv = ...; //for example...
func(rv); // rv is not implicily moved into func
rv.xxx; // still available!
func(std::move(rv)); // only move transfer ownership

生命周期延长

在出一个函数(还有new)之前,把rvalue传给const T&T&&,它暂时不会析构。
注意如果有class X{ const T& t; };X x{{1}}没啥问题,X *x = new X{{1}}会dangling ref。

https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary

const ref vs move?

https://stackoverflow.com/questions/63466914/move-semantics-vs-const-reference?noredirect=1&lq=1

1
2
3
4
5
6
7
8
9
class X {
std::string s;
public:
explicit X(const std::string &s) : s{s} {} //or
explicit X(std::string &&s) : s{std::move(s)} {} //or
explicit X(std::string s) : s{std::move(s)} {} //or
template<typename T>
explicit X(T&& s) : s(std::forward<T>(s)) {}
}
有几个问题: 1. 哪个避免拷贝? 2. rvalue不能直接传const ref. 如何解决?

好像是(3)比较常用...

还没实际测过。

SUSTechCS109ProjectGuide

南方科技大学CS109计算机程序设计基础期末project的一些指南

仍在持续更新中。欢迎讨论和PR。

作者QQ号是815559068。有问题私戳或者直接在互助群@Froster问。

写在前面

每学期都会看到基本所有的同学写project的时候都会在屎山里挣扎...

于是就有了这个东西。基本上是写代码需要知道,但是上课不会教你的内容。你也可以把它当作一个Q&A。

随项目还会提供一个库,里面有音乐播放器,EventCenter,可设背景图的JPanel和永远是方形的JPanel。

这篇文章的博客链接:https://blog.froster.icu/SUSTechCS109ProjectGuide/
这篇文章的github链接:https://github.com/Fros1er/SUSTechCS109ProjectGuide/

各位同志依据自己水平酌情观看。有些东西可能对你们过于复杂了。(我对你们的水平的分布完全没概念,非常抱歉!)

但是看不懂也不要说老师没讲,就开摆了。大伙都是靠自学过来的,只能说大学教育是这样的。。。总之遇见不懂的就思考,然后问,无论是问搜索引擎还是问我还是在互助课堂里问。如果回答的内容也不懂,接着问。使用递归学习法(乐)。

这玩意没想象中那么复杂,计算机这种东西有兴趣做的话什么都学得会。加油捏()

在开头的最后附上一句吧。

"In the information age, the barriers just aren’t there," he said. "The barriers are self-imposed. If you want to set off and go develop some grand new thing, you don’t need millions of dollars of capitalization. You need enough pizza and Diet Coke to stick in your refrigerator, a cheap PC to work on, and the dedication to go through with it. We slept on floors. We waded across rivers."

By John Carmack.
阅读全文 »

有关图形学的一点点笔记。不过因为为一般会用ipad记,所以这里的就当复习用吧....
不会太详细,毕竟是笔记。

阅读全文 »

总之打完第二年RM之后(也许应该是学完计算机组成原理)突然发现,我好像会那么点嵌入式了。于是想做点好玩的,于是就经典老番自动开灯了。

(然后咕到现在 ——2022/11/16

阅读全文 »

我也没想到我第一篇博客会是ctf...其实之前有很多可以写的东西,但那基本上是高中的时候,我没有稳定的环境(其实就是自己不会)跑hexo(确信)。

总之,目前有在参加COMPASS的培训。打不打比赛不知道,主要还是想图一乐加上了解一点点security。然后我需要点地方记笔记,就把这个远古page拿过来用了。

以下是正文,会持续更新。

阅读全文 »