网络编程
文章平均质量分 65
基于Linux网络编程
KingOfMyHeart
会好起来的.
展开
-
IO的阻塞,非阻塞,同步以及异步详解
IO的第一个阶段,数据(指TCP缓冲区数据)的准备状态:阻塞与非阻塞阻塞Linux上,当我们创建或者申请一个文件描述符时,默认时阻塞的举个例子,我们进行网络编程时,调用accept()获取一个连接的文件描述符,然后我们去读写该文件描述符与客户端进行数据的交互:int n = recv(connfd, buf, len, flags);当内核缓冲区的数据没有准备好时,即connfd上没有数据,当前调用该函数的接口的线程将会阻塞,会被操作系统调度程序挂起非阻塞我们可以调用fcntl()相关的方法原创 2021-06-15 21:55:03 · 517 阅读 · 2 评论 -
Linux网络编程之端口复用 Address already in use
为什么需要端口复用我们直到,TCP连接在进行4次挥手断开连接时,为了确保最后一次ACK到达对端,保证对端正确关闭资源,以防止对傻傻等待浪费网络和计算机资源,要求等待2MSL时常,那么对于我们需要立即重启程序的情况不友好,有过经验的朋友都知道,我们关闭一个链接,然后立马重启这个连接,一般会报bind失败:虽然这个图是客户端主动断开连接,实际服务端主动断开也是一样的过程bind error: Address already in use表示端口号正在被占用,因为前一次的链接还没有被完全释放,通过指令可原创 2021-05-10 07:41:20 · 305 阅读 · 0 评论 -
IO多路转接epoll函数解析复习
函数原型:open an epoll file descriptor: 打开一个epoll文件系统#include <sys/epoll.h>int epoll_create(int size);参数:在内核中开辟一块内存,创建一个epoll文件系统(也叫内核事件表、是一棵红黑树),参数size是对内核的一个建议,但是一定要比0大,不一定起作用,表示监听的文件描述符个数,也就是基础红黑树的建议大小。返回值:ret > 0 返回一个可用,合法的文件描述符,表示创建的epo原创 2021-05-09 17:38:38 · 135 阅读 · 0 评论 -
IO多路转接之poll函数解析
函数原型:#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);返回值:ret > 0 ,表示有事件发生的文件描述符的个数,可以去遍历fds,看哪个fd发生事件,并且根据对应的revent做下一步处理ret == 0,表示超时,且还没有事件发生ret<0,表示失败,可以根据全局变量errno来判断下一步的动作参数解析:struct pollfd *fds:是一个数组,将所有原创 2021-05-09 14:33:27 · 359 阅读 · 0 评论 -
系统错误码EINTR以及如何模拟出一个EINTR
为什么会有EINTR错误,什么是慢系统调用:下面这段话我是从网上找的,总结的挺好,我就直接拿来用:慢系统调用:适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类;**常见慢系统调用:**例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的,函数出错为Interrupted system call,包括设置等待时间为阻塞等待的select、poll、epoll_wait也是一样的道理;EINTR错原创 2020-07-19 15:18:03 · 1017 阅读 · 0 评论 -
epoll基本使用与介绍(附源码)
#include <sys/socket.h>#include <sys/types.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <errno.h> #include <string.h>#inclu原创 2020-07-18 20:27:01 · 748 阅读 · 0 评论