1.介绍重要的socket()函数
1.1.socket():返回一个文件描述符
实际上所有的读取都是通过文件描述符来进行读取,文件描述符表示一个进程与打开文件之间对应关系,
使用int 唯一标识文件,下次进行读取的时候也通过打开文件时候返回的文件标识符进行读取!网络读取也会是一样的!
1.2.bind():将ip和port绑定
网络协议只用规定将接受到的第一个字节作为高位字节,也就是说将高位放在低地址处,采用大端法,
但是本机平台一般都采用的是小端法,所以要进行转换
1.3.listen():
监听fd,把一个未连接的套接字转换成为一个被动套接字,指示内核应接受指向该套接字的连接请求
1.5.accept()
用于从已完成队列头返回下一个已完成连接,返回一个全新的fd,用于通信,读写文件流
2.epoll
就是java中的多路复用
感觉就像是连接池一样的存在,都是使用一个容器来统一管理
使用队列,先把要监听的时间注册到数组中,当有事件准备好的时候,就加到就绪队列中,然后在进行操作
2.1.epoll_ctl():将需要监听的事件注册到数组中
2.2.epoll_waite():返回就绪队列中事件的数目
2.3.工作模式:
- 水平:默认模式,当有事件准备好的时候,加到就绪列队列中,只要你没对此事件进行处理就会一直通知你
- 边缘:相反,边缘模式只通知一次就不会再通知,也就是说如果你没做处理,这一次的事件连带的数据都丢失了
2.4.注意事项:
当此次事件处理之后,不需要监听的时候要从数组中删除这个事件,否则这个事件会一直在
3.read/write
3.1read(fd, buf, len);返回读到的字节数,不管是什么内容只管读就好
返回的场景:
读到len个字节
缓冲区为空
出错(一般只处理EINTR异常)
3.2write(fd, buf, len);返回已经写进缓冲区的字节
返回的场景:
已经写了len个字节
缓冲区满
出错
4、readn() 和writen()让其返回len个字节(不会丢失数据)
通过判断返回的字节数,是否==len来做控制让其达到一定读写了len字节到缓冲区
网络编程基础
5.一个分发日志的小demo涉及到socket,读写文件,epoll,博客总结的都是平时自己需要的或者踩过的坑,
具体的用法细节可直接戳分发日志