一.多进程并发服务器
多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。
概念:
优点:
缺点:
综上所述,多进程并发服务器能够满足高并发处理需求,并具有稳定性和简单性等优点。然而,它也存在资源消耗较高和调试困难等缺点,根据实际需求和应用场景选择合适的服务器架构是很重要的。
案例
利用多进程,在TCP通信的基础上,实现服务器可以同时连接多个客户端。实现大小写转换。
service.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void handler(int sig)
{
if (sig == SIGCHLD)
{
while(waitpid(0,NULL,WNOHANG)>0);
}
}
int main(int argc, char const *argv[])
{
//1.建立socket套接字
int socked = socket(AF_INET, SOCK_STREAM, 0);
if (socked < 0)
{
perror("socket is err");
return -1;
}
//2.bind绑定服务器ip和端口号
struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
int len = sizeof(caddr);
int rev = bind(socked, (struct sockaddr *)(&saddr), sizeof(saddr));
if (rev < 0)
{
perror("bind is err");
return 0;
}
//3.listen设置最大同时链接数量
rev = listen(socked, 32);
if (rev < 0)
{
perror("rev is err");
return 0;
}
//4.建立子进程负责服务器给客户端发送消息,并且主进程不结束,此进程不结束
char buf[1024] = {0};
int size=0;
while (1)
{
int acceptfd = accept(socked, (struct sockaddr *)(&caddr), &len);
if (acceptfd < 0)
{
perror("accept is err");
return 0;
}
pid_t pid = fork();
if (pid < 0)
{
perror("pid is err");
return 0;
}
else if (pid == 0)
{
//子进程,每个子进程维护一个客户端
//不许要监听,直接关掉
close(socked);
while (1)
{
int flage = recv(acceptfd, buf, sizeof(buf), 0);
if (flage < 0)
{
perror("recv is err");
}
else if (flage == 0)
{
printf("ip:%s is close\n", inet_ntoa(caddr.sin_addr));
close(acceptfd);
break;
}
else
{
size = strlen(buf);
for (int i = 0; i = 'a' && buf[i] acceptfd;
struct sockaddr_in caddr = cl->caddr;
while (1)
{
int flage = recv(acceptfd, buf, sizeof(buf), 0);
if (flage < 0)
{
perror("recv is err");
}
else if (flage == 0)
{
printf("ip:%s is close\n", inet_ntoa(caddr.sin_addr));
close(acceptfd);
break;
}
else
{
size = strlen(buf);
for (int i = 0; i = 'a' && buf[i]