
WEB服务器开发笔记
文章平均质量分 62
开发笔记
三Ⅶ
这个作者很懒,什么都没留下…
展开
-
5-1阻塞/非阻塞、同步/异步
阻塞/非阻塞、同步/异步典型的一次IO的两个阶段是什么?数据就绪 和 数据读写数据就绪:根据系统IO操作的就绪状态阻塞非阻塞数据读写:根据应用程序和内核的交互方式同步异步同步:调用函数之后,得到程序结果之后,立马往下执行(花费的是程序的时间);例子:买机票,打车去机场取机票(这个动作花费的是你自己的时间);编程较为简单;异步:异步IO接口(sockfd,buf,通知方式(一般是sigio信号)),需要通知方式,不用等程序调用函数返回结果,等待操作系统(内核)将数据放入buf之中,通知原创 2021-12-01 20:55:17 · 452 阅读 · 0 评论 -
WEB服务器代码解析-线程池
locker.h头文件#ifndef LOCKER_H#define LOCKER_H#include <exception>#include <pthread.h>#include <semaphore.h>// 线程同步机制封装类#endif定义互斥锁类// 互斥锁类class locker {public: locker() {//构造函数 if(pthread_mutex_init(&m_mutex,原创 2021-12-10 19:23:09 · 241 阅读 · 0 评论 -
4-33--4-35
4-33广播向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。a.只能在局域网中使用。b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。// 设置广播属性的函数int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_toptlen); - sockfd : 文件描述符原创 2021-12-01 17:43:03 · 2167 阅读 · 0 评论 -
4-29——4.32
4-29 epoll API以及应用epoll原理#include <sys/epoll.h>// 创建一个新的epoll实例。在内核中创建了一个数据,这个数据中有两个比较重要的数据,一个是需要检测的文件描述符的信息(红黑树),还有一个是就绪列表,存放检测到数据发送改变的文件描述符信息(双向链表)。int epoll_create(int size); - 参数: size : 目前没有意义了。随便写一个数,必须大于0 - 返回值: -原创 2021-11-30 16:52:00 · 116 阅读 · 0 评论 -
4-24--4-28
4-24 半关闭,端口复用半连接的API#include <sys/socket.h>int shutdown(int sockfd, int how);sockfd: 需要关闭的socket的描述符how: 允许为shutdown操作选择以下几种方式: SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。 该套接字不再接收数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉。 SHUT_WR(原创 2021-11-29 22:02:32 · 1437 阅读 · 0 评论 -
4-20-4-23并发服务器,TCP状态转换;
要实现TCP通信服务器处理并发的任务,使用多线程或者多进程来解决。思路:一个父进程,多个子进程2.父进程负责等待并接受客户端的连接3.子进程:完成通信,接受一个客户端连接,就创建一个子进程用于通信。服务端代码:#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include &l原创 2021-11-28 19:25:16 · 1733 阅读 · 0 评论 -
网络编程4.15-4.19
4.15-4.16 TCP实现通信流程:服务端代码;// TCP 通信的服务器端#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main() { // 1.创建socket(用于监听的套接字) int lfd = socket(AF_INET, SOCK_原创 2021-11-27 17:19:50 · 937 阅读 · 0 评论 -
网络编程4.10-4.14
4.10字节转换函数当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的解释之。解决问题的方法是:发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)。网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。BSD原创 2021-11-26 21:52:42 · 313 阅读 · 0 评论 -
计算机网络编程4.6-4.9
4.6-4.7网络通信过程封装上层协议是如何使用下层协议提供的服务的呢?其实这是通过封装(encapsulation)实现的。应用程序 数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上加 上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程就称为封装。封装过程:加头部和尾部;分用当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。这个过程称为分用(d原创 2021-11-25 21:56:28 · 1003 阅读 · 0 评论 -
第四章 网络编程4.1-4.5
前三章需要掌握内容第一章1.静态库动态库的使用,编程2.虚拟地址空间3.文件描述符4.dup dup2 fcnl函数第二章1.进程状态转换2.父子进程的虚拟地址空间3.孤儿僵尸进程(wait函数,非阻塞)4.进程间通信的方式5.fork函数6.守护进程(后台一直运行的进;守护进程实现的步骤)第三章1.线程常用API;2.线程同步(互斥锁,读写锁)3.生产者消费者模型4.1网络结构模式cs结构简介:服务器 - 客户机,即 Client - Server(C/S)结构。C原创 2021-11-24 20:50:16 · 721 阅读 · 0 评论 -
3-11—14 多线程同步 part-2
读写锁◼ 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题。◼ 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用。为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现。◼ 读写锁的特点: 如原创 2021-11-22 11:07:01 · 488 阅读 · 0 评论 -
3.8-2.10 线程同步 part1
设计一个买票程序#include<stdio.h>#include<pthread.h>void*sell(void *arg){ int ticket=20; while(ticket>0) { printf("%ld is sellinf %d th ticket\n",pthread_self(),ticket); ticket--; } return NULL;}int main()原创 2021-11-21 19:58:27 · 811 阅读 · 0 评论 -
3-6线程取消
#include <pthread.h>int pthread_cancel(pthread_t thread); - 功能:取消线程(让线程终止) 取消某个线程,可以终止某个线程的运行, 但是并不是立马终止,而是当子线程执行到一个取消点,线程才会终止。 取消点:系统规定好的一些系统调用,我们可以粗略的理解为从用户区到内核区的切换,这个位置称之为取消点。程序代码:#include <stdio.h>#include &原创 2021-11-18 14:00:39 · 102 阅读 · 0 评论 -
3-4 连接已终止的线程
/* #include <pthread.h> int pthread_join(pthread_t thread, void **retval); - 功能:和一个已经终止的线程进行连接 回收子线程的资源 这个函数是阻塞函数,调用一次只能回收一个子线程 一般在主线程中使用 - 参数: - thread:需要回收的子线程的ID原创 2021-11-18 11:18:34 · 526 阅读 · 0 评论