hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中,你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!!
希望这篇文章能对你有所帮助
,大家要是觉得我写的不错的话,那就点点免费的小爱心吧!
![]()
目录
一.网络服务器
1.1 普通循环网络服务器
对于普通的循环网络服务器,其实就是服务器使用循环的方法逐个对客户的连接进行处理,处理完一个连接后再处理下一个连接,其过程如下:

最简单的代码模型我还是给大家:
#include<t_stdio.h>
#include<sys/types.h>
#include <sys/socket.h>
#include<arpa/inet.h>
#include <sys/socket.h>
#include<ctype.h>
#include<unistd.h>
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<r;i++){
buf[i]=toupper(buf[i]);
}
//将处理结果回送客户端
write(c_fd,buf,r);
//关闭本次连接
close(c_fd);
}
return 0;
}
这是最简单的循环服务器代码,功能是将客户传过来的字符串全部转换为大写,这个最简单代码希望大家能全部弄懂,关于里面还有不懂的,可以去看我我前面的博客:[C++/Linux] socket套接字函数-优快云博客
2.2 简单并发网络服务器
并发网络服务器是指能够同时处理多个客户端请求的网络服务器。这种服务器的设计允许它在任何时刻处理多个客户端的连接和请求,而不会因为某个请求的处理而阻塞其他请求。并发服务器可以提高资源的利用率,增强服务器的响应能力,是现代网络应用的基础。下面我将介绍几种常见的并发网络服务器模型:
2.2.1简单的并发服务器模型
-
迭代服务器(Iterative Server): 这种服务器一次处理一个请求。它接收一个请求,处理完该请求,然后才接收下一个请求。这种模型简单,但效率低下,因为它在处理一个请求时不能处理其他请求。
-
并发服务器(Concurrent Server): 并发服务器可以同时处理多个请求。这通常通过多进程或多线程来实现。服务器的主进程或线程监听端口,接受新的连接,然后为每个连接创建一个新的进程或线程来处理请求。

本文介绍了在网络编程中构建高性能并发服务器的方法,包括普通循环服务器、多进程和多线程并发模型,以及使用互斥锁实现单线程处理单个客户。作者提供了源码剖析和UML图示例,帮助读者理解并发服务器的工作原理和实现策略。
最低0.47元/天 解锁文章
1115





