网络编程
hober.z
修炼
展开
-
NIO通信架构原理学习笔记
1. BIO1.1 BIO概念即 Blocking IO 同步阻塞IO阻塞:在单线程的环境下,IO操作没有完成的话,当前线程不能进行其他操作(流的一个特性是阻塞的)1.2 BIO原理BIO模型中,accept得到一个Socket之后,需要创建线程对每一个Socket进行处理。1.3 BIO问题当客户端多了之后,服务端对应的处理线程也会增加,每一个线程都会占用栈空间和CPU资源针对...原创 2018-10-16 18:08:21 · 952 阅读 · 0 评论 -
HTTPS工作原理:如何保证通讯的安全?
https结构https在原有的http协议与tcp协议之间新增了一层,这一层初始使用的是ssl加密,后续逐渐使用tls。https设计思路首先需要明白https诞生的原因:解决通信过程中的安全问题,不会被攻击者获取通信中的信息。为了实现这一目标,我们第一想法是对通信的内容进行加密。如对称加密、非对称加密等。非对称加密安全性较高,但是比较耗时,所以我们尽量使用对称加密进行通信。对称加...原创 2018-10-07 01:36:46 · 400 阅读 · 0 评论 -
UDP实现迭代型网络通信
UDP是无连接不可靠的数据报协议,因此与TCP不同,UDP协议中客户端不需要和服务器建立连接。总体流程:pic here服务端流程:1.初始化套接字2.bind3.recvfrom4.sendtoint main(int argc, char **argv){ int sockfd; struct sockaddr_in serv原创 2017-05-23 16:55:36 · 331 阅读 · 0 评论 -
预分配线程(prethreading)
预分配线程(prethreading)是让服务器在启动阶段创建一个线程池,每个客户请求由当前可用线程池中的某个闲置线程处理1.初始版本:每个客户一个线程int main(int argc,char **argv){ int listenfd,connfd; void sig_int(int); void *doit(void *); pthread_t原创 2017-05-23 16:48:56 · 744 阅读 · 0 评论 -
预先派生子进程(preforking)
预先派生子进程(preforking)是让服务器在启动阶段调用fork创建一个子进程池。每个客户请求由当前可用子进程池中的某个闲置子进程处理。预先派生子进程服务器程序1.初始版本(accept无上锁保护)static int nchildren; static pid_t *pids; int main(int argc,char **argv){ int liste原创 2017-05-23 16:44:35 · 804 阅读 · 0 评论 -
线程化TCP
线程版本使用fork创建子进程进行处理,这种代价是昂贵的。我们可以将其改写为线程版本。 使用线程的str_cli函数static int sockfd;static FILE *fp;void str_cli(FILE *fp_arg,int sockfd_arg){ char recvline[MAXLINE]; pthread_t tid;原创 2017-05-23 16:39:29 · 336 阅读 · 0 评论 -
非阻塞IO
以前各个版本套接字的默认状态是阻塞的,这样带来的时间消耗是巨大的。我们可以修改其为非阻塞版本。非阻塞式IO方式重写str_cli函数void str_cli(FILE *fp,int sockfd){ int maxfdp1,val,stdineof; ssize_t n,nwritten; fd_set rset,wset; char to[MAX原创 2017-05-23 16:36:30 · 372 阅读 · 0 评论 -
select与shutdown
我们已经实现了一个基本的并发回射服务器程序,但是依然存在问题。如果当客户端阻塞于标准输入时,服务器进程可能因为各种原因结束了。服务器TCP虽然正确的给客户端TCP发送了一个FIN,但是客户端进程正阻塞在标准输入上,可能很长时间之后才能接受到这个信息。针对这个问题,可以使用IO复用方法来解决。客户端程序既要处理标准输入,又要处理套结字上到达的信息。对于多种IO,使用select函原创 2017-05-23 16:31:33 · 534 阅读 · 0 评论 -
TCP实现标准客户/服务模式(停-等模式)
服务端流程:1.初始化套结字2.bind3.listen4.阻塞于accept,等待客户端连接5.有客户端连接到达,父进程通过fork创建子进程对其处理,父进程关闭连接,继续监听程序:int main(int argc,char **argv){ int listenfd,connfd; pid_t childpid; socklen_t原创 2017-05-23 16:21:03 · 296 阅读 · 0 评论 -
网络编程常用函数
bzero将目标字节串中制定数目的字节置为0inet_ptonint inet_pton(int family,const char *strptr,void *addrptr)p(presentation)代表表达,n(numeric)代表数值int_pton将ip地址从表达格式转换为数值格式,即将“点分十进制”转化为“二进制整数”功能:该函数将我们输入的ip地址原创 2017-05-23 16:26:04 · 584 阅读 · 0 评论