【网络编程】
文章平均质量分 90
知识巩固
不知所措的渣渣辉
这个作者很懒,什么都没留下…
展开
-
【网络编程】更强的IO复用模型:epoll
epoll可以说是和poll非常相似的一种I/O多路复用技术,epoll通过监控注册的多个描述字,来进行I/O事件的分发处理。不同于poll的是,epoll不仅提供了默认的level-triggered(条件触发)机制,还提供了性能更为强劲的edge-triggered(边缘触发)机制,在后面小结会展开分析。使用epoll进行网络程序的编写,需要三个步骤,分别是epoll_ctlepoll_wait下面将逐一分析一下。默认采用的模式但是只支持非阻塞模式https。.........原创 2022-07-19 21:02:29 · 262 阅读 · 0 评论 -
【网络编程】IO多路复用的搭档:非阻塞IO
本文主要是针对非阻塞IO的相关知识进行了学习总结。原创 2022-07-19 19:39:50 · 892 阅读 · 0 评论 -
【网络编程】IO多路复用:poll函数
相比于select,poll函数和内核交互的数据结构也有所改变。fds监听的文件描述符数组intfd;//待监听的文件描述符//待监听的文件描述符对应的监听事件,取值为//传入时,给0。如果满足对应事件的话,返回非0-->POLLIN、POLLOUT、POLLERR};nfds描述的是数组fds的大小,简单说,就是向poll申请的事件检测的个数。timeout描述了poll的行为。大于0超时时长。单位毫秒;-1阻塞等待,有事件之前,永远等待;0不阻塞,立即返回。...原创 2022-07-19 16:41:44 · 1369 阅读 · 0 评论 -
【网络编程】IO多路复用:select函数
nfds监听的所有文件描述符中,最大文件描述符+1,表待监听文件符的数量,文件描述符下标从0开始。*readset读文件描述符监听集合,传入、传出参数writeset写文件描述符监听集合,传入、传出参数exceptset异常文件描述符监听集合,传入、传出参数timeout定时器大于0设置监听超时时长NULL阻塞监听0非阻塞监听,轮询那么如何设置这些描述符集合呢?以下的宏可以帮助到我们。//清空一个文件描述符集合//将待监听的文件描述符,添加进监听集合中。......原创 2022-07-19 15:42:57 · 1375 阅读 · 0 评论 -
【网络编程】检查数据的有效性:缓冲区处理
在网络编程中,需要多注意异常边界的检测问题,因为这些问题决定了程序运行的稳定性,不要动不动就崩了。要时刻提醒自己做好应对各种复杂情况的准备,这里的异常情况包括缓冲区溢出、指针错误、连接超时检测等。问题一在读数据的时候,一般都需要给应用程序最终缓冲区分配大小,这个大小咋确定?最终缓冲区的大小应该比预计接收的数据大小大一些,预防缓冲区溢出。问题二这里的缓冲区是否可以换成动态分配?可以的,但是要记得在return前释放缓冲区。...原创 2022-07-17 16:47:45 · 465 阅读 · 0 评论 -
【网络编程】地址已经被使用:”Address already in use“
在所有TCP服务器程序中,调用bind之前请设置SO_REUSEADDR套接字选项。这不会产生危害,相反,它会帮助我们在很快时间内重启服务端程序,而这一点恰恰是很多场景所需要的。问题一关于tcp_tw_reuse和SO_REUSEADDR的区别tcp_tw_reuse是为了缩短time_wait的时间,避免出现大量的time_wait链接而占用系统资源,解决的是accept后的问题;https。.........原创 2022-07-17 15:06:51 · 5620 阅读 · 1 评论 -
【网络编程】如何检测无效连接?keep-alive?心跳?
虽然TCP没有提供系统的保活能力,让应用程序可以方便地感知连接的存活,但是,我们可以在应用程序里灵活地建立这种机制。一般来说,这种机制的建立依赖于系统定时器,以及恰当的应用层报文协议。比如,使用心跳包就是这样一种保持KeepAlive的机制。...原创 2022-07-17 13:08:35 · 996 阅读 · 0 评论 -
【网络编程】双向的TCP如何关闭?close ?shutdown?
close函数只是把套接字引用计数减1,未必会立即关闭连接;close函数如果在套接字引用计数达到0时,立即终止读和写两个方向的数据传送。基于这两点,在期望关闭连接其中一个方向时,应该使用shutdown函数。...原创 2022-07-17 10:44:54 · 1084 阅读 · 0 评论 -
【网络编程】对套接字读写的理解(2):writev和readv的使用场景
在前面一篇文章里面说到了write和read的简单读写,讨论了一下发送缓冲区的问题。在介绍writev和readv的具体用法之前,先从TCP角度来理解一下数据流的发送和接收,这能让我们进一步理解套接字读写的内涵。通过前面的内容知道,调用这些接口并不意味着数据被真正发送到网络上,其实,这些数据只是从应用程序中被拷贝到了系统内核的套接字缓冲区中,或者说是发送缓冲区中,等待协议栈的处理。至于这些数据是什么时候被发送出去的,对应用程序来说,是无法预知的。对这件事情真正负责的,是运行于操作系统内核的 TCP 协议栈实原创 2022-07-13 21:32:49 · 705 阅读 · 1 评论 -
【网络编程】对套接字读写的理解(1):write、send 和read
在封装TCP读写的时候,遇到了读写函数的选择问题,进而研究了一下,在此记录。常用的三个函数分别为write、send 和 sendmsg。函数原型如下:每个函数可以单独使用,但使用的场景有所不同:上面这些可能查下资料,大家基本都可以知道,然后觉得套接字读写和普通文件的读写没有什么区别,其实里面暗含了很多内在的区别。对于普通文件描述符而言,一个文件描述符代表了打开的一个文件句柄,通过调用 write 函数,操作系统内核帮我们不断地往文件系统中写入字节流。注意,写入的字节流大小通常和输入参数 size 的值是原创 2022-07-13 19:45:04 · 2920 阅读 · 0 评论