【网络编程】高性能并发服务器源码剖析
hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中,你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!!
希望这篇文章能对你有所帮助,大家要是觉得我写的不错的话,那就点点免费的小爱心吧!
目录
一.网络服务器
1.1 普通循环网络服务器
2.2 简单并发网络服务器
2.2.1简单的并发服务器模型
2.2.2使用进程的并发服务器
2.2.3使用线程的并发服务器
2.2.4其他并发服务器模型
二.使用互斥锁实现单线程处理单个客户
2.1 具体步骤
2.2服务器代码模板
三.源码剖析
一.网络服务器
1.1 普通循环网络服务器
对于普通的循环网络服务器,其实就是服务器使用循环的方法逐个对客户的连接进行处理,处理完一个连接后再处理下一个连接,其过程如下:
最简单的代码模型我还是给大家:
#include #include #include #include #include #include #include int main(void){ struct sockaddr_in serv,cli; socklen_t cli_len; char buf[128]; char IP[32]; //创建一个通讯端点,返回该端点的文件描述符 //创建一个ipv4的tcp连接端口 int s_fd=socket( AF_INET ,SOCK_STREAM ,0); //需要对server变量成员初始化 serv.sin_family=AF_INET; serv.sin_port=htons(5556); serv.sin_addr.s_addr=htonl(INADDR_ANY); //将s_fd和本地地址,端口号绑定 int b=bind(s_fd,(struct sockaddr *)&serv,sizeof(serv)); if(b==-1)E_MSG("bind",-1); if(s_fd==-1)E_MSG("socket",-1); //将s_fd设置为被动连接,监听客户端连接的到来 //将客户端到来的连接放入未决连接队列中 //指定未决连接队列的长度 listen(s_fd,5); while(1){ //从s_fd设备的未连接队列中提取一个进程进行处理 //返回一个连接描述符,使用这个连接描述符与客户端进行通讯 int c_fd=accept(s_fd,(struct sockaddr *)&cli,&cli_len); if(c_fd==-1)E_MSG("accept",-1); //binary--->text inet_ntop(AF_INET,&cli.sin_addr,IP,32); printf("client ip: %s\n",IP); //代码执行到这里,三次握手以及完成,可以进行数据传输了 //从c_fd中读取客户端发送过来的请求信息 int r = read(c_fd,buf,128); //处理客户端的请求信息 int i; for(i=0;i 0 && !strncmp(buf , "TIME" , 4))//判断是否为合法接收数据 { memset(buf ,0 ,bufferlen); now = time(NULL); sprintf(buf , "%24s\r\n",ctime(&now));//时间写入buf send(s_c , buf , strlen(buf) , 0);//发送给客户端 } close(s_c); } return ; } //线程创建函数 static void handle_connect(int s){ int s_s =s; pthread_t thread_do[max_pthread];//创建线程数组 int i=0; //创建线程,每一次创建调用线程处理函数 for(i = 0; i
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。