前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C/S模式下---多进程编程

C/S模式下---多进程编程

作者头像
lexingsen
发布于 2022-02-24 07:17:43
发布于 2022-02-24 07:17:43
21600
代码可运行
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客
运行总次数:0
代码可运行

在单进程下进行socket的编程,服务器通过accept()获取到客户端的文件描述符,并且与该客户端进行交互。但是实际有两方面的因素都促使服务器应该能够同时与多个客户端进行交互。

1.listen()函数将已经完成三次握手和即将完成三次握手的客户端文件描述符存放到队列中。 2.在实际客户端与服务器进行交互时,服务器必须能够同时与多个客户端进行交互。

多进程编程的优势: 1.能够处理同时处理多个客户端的连接,并且能够与客户端进行交互。 2.子进程可以共享fork()之间父进程打开的文件描述符,而不需要在进程之间传递文件描述符,简化了编程。 3.服务器处理的每个客户连接都是相互独立的,因为进程之间是相互独立的。。 4.任务分派明确,父进程只需处理客户端的连接,子进程只需要与客户端进程交互即可。

多进程服务器端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <sys/scoket.h>
#include <arpa/inet>  
#include <netinet/in.h>
#include <assert.h>
#Include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>

void zmobie(){
	wait(NULL);
}

void communicateWithCli(int c){
	char buff[128] = {0};
	while(1){
		int n = recv(c,buff,127,0);
		if(n<=0){
			printf("one client quit!");
			break;
		}
		printf("%d : %s",c,buff);
		send(c,"OK",2,0);
	}
}

int main(){
	signal(SIGCHLD,zmobie);
	int fd = socket(AF_INET,SOCK_STREAM,0);
	assert(fd!=-1);
	
	struct sockaddr_in cli,ser;
	ser.sin_family = AF_INET;
	ser.sin_port = htons(5000);
	ser.sin_addr.s_addr = inet_addr("127.0.0.1");

	int res = bind(fd,(struct sockaddr*)&ser,sizeof(ser));
	assert(res!=-1);	

	res = listen(fd,5);
	assert(res!=-1);

	while(1){
		socklen_t len = sizeof(cli);
		int c = accept(fd,(struct sockaddr*)&cli,&len);
		if(c==-1){
			printf("link error!");
			continue;//继续进行连接
		}
		pid_t pid = fork();
		assert(pid!=-1);
		//子进程
		if(pid==0){
			communicateWithCli(c);
			exit(0);//向父亲发出信号,避免成为僵死进程,因为父进程是一直启动的
		}
		//父进程
		else{
			close(c);
		}
	}
	close(fd);
	return 0;
}

执行结果:

从执行结果可以看出,有四个客户端可以同时和服务器进行交互,通过多进程的方式就解决了在最前提出的问题。

值得探究的是为什么每次服务器端输出的客户端的文件描述符都是4?

为什么在父进程中需要关闭客户端的文件描述符? 文件描述符作为进程的资源是有限的,处于C/S的模式下,主进程只需要负责与客户端连接,而不需要去做具体的逻辑处理。连接之后就不需要该客户端的文件描述符了,具体与客户端进行交互的进程中已经拿到对应的文件描述符了。因此,在父进程中关闭客户端的文件描述符可以减少不必要的资源浪费。

基于C/S模式,采用多进程编程的缺点 1.在系统可以打开的进程是有限个数的,为每一个客户端分配一个进程开销太大,如果客户端占着不用,或者只有少量数据的传输,开进程是划不来的。 2.一个客户端独占一个进程,资源浪费。 3.当客户端退出时,子进程结束。 4.如果由大量的客户端同时连接服务器,服务器可能会崩溃。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tcp协议Socket编程
  本次socket编程需要使用到 日志文件,此为具体日志编写过程。以及 线程池,线程池原理比较简单,看注释即可。
用户11029129
2024/11/22
590
Tcp协议Socket编程
【Linux】Socket编程—TCP
  下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。
大耳朵土土垚
2025/02/15
1250
【Linux】Socket编程—TCP
【Linux网络编程】Socket编程--TCP:echo server | 多线程远程命令执行
在学习本章之前,先看【Linux网络编程】Socket编程–UDP:实现服务器接收客服端的消息 | DictServer简单的英译汉的网络字典 | 简单聊天室】,里面详细介绍函数的使用方法,小编在这篇文章不再具体介绍。
南桥
2024/11/14
1250
【Linux网络编程】Socket编程--TCP:echo server | 多线程远程命令执行
论Linux进程间通信
在操作系统中,内核空间是所有进程共用的,而每个进程都拥有自己的用户空间。这种结构类似于一个公共图书馆,每个进程都有自己的阅读室”(用户空间),但它们都可以通过特定的走廊”(系统调用)访问这个图书馆(内核空间)。
小文要打代码
2025/03/04
1320
论Linux进程间通信
【计算机网络】TCP协议详解
在上一篇博客中,我们学习了Udp协议的相关内容,今天我们开始学习Tcp协议相关的本内容,并带着大家完成相关的代码的编写。
破晓的历程
2024/08/20
2590
【计算机网络】TCP协议详解
网络(TCP)
socket()函数用法详解:创建套接字 - C语言中文网 (biancheng.net)
ljw695
2024/11/21
1140
网络(TCP)
通过tinyhttpd-0.1.0源码理解服务器原理
tinyhttpd是一个demo版的服务器。代码几百行。源码分析在http://suo.im/6bkZlt。从中可用一窥服务器的基础原理。他采用的是一个请求新开一个线程处理的方式。里面涉及了多进程、多线程、进程间通信等知识。 我们从main函数开始分析。
theanarkh
2020/04/14
4430
C/C++ 服务器并发
1. 单线程 / 进程 在 TCP 通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在介绍 TCP 通信流程的时候,提供的服务器代码却不能完成这样的需求,先简单的看一下之前的服务器代码的处理思路,再来分析代码中的弊端: // server.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> int main() {    
范蠡
2022/03/04
9100
C/S模式下---多线程编程
服务器采用单进程/线程编程,在同一时刻,服务器只能与一个客户端进行交互。只有与当前客户端的通信结束后,才能为下一个客户端进行服务。所以,如果采用线程,让主线程连接客户端,而函数线程为每个客户端进行服务,这样就可以保证服务器可以同时为多个客户端提供服务,实现并发。
lexingsen
2022/02/24
3570
C/S模式下---多线程编程
socket 多进程/多线程模型实现
前文我们实现了一个 socket 最小的实现,它只允许一台终端连接到服务器进行数据通信,但这样的程序对我们来说没有什么意义,所以我们一定要实现多个客户端与一个服务端通信交互数据,这样才能真正派上用场,所以本文主要介绍了两种实现多客户端连接的方案,一种是多进程,一种是多线程,两种性能相差无几,但明显多线程在资源方面明显要比多进程消耗要少的多。
我与梦想有个约会
2023/10/20
3880
socket 多进程/多线程模型实现
Linux 多进程编程详解
多进程编程是现代操作系统中一种重要的并发编程技术。通过在同一程序中运行多个独立的进程,可以实现并发处理,充分利用多核处理器的优势,提高程序的运行效率。本文将详细介绍Linux多进程的基本概念、创建方法、进程间通信、同步机制以及实际应用,配以C++示例代码,帮助读者深入理解和掌握多进程编程技术。
ahao
2024/07/16
2710
Socket编程---TCP篇
但是,并不是说,TCP就是百利而无一害的。前面说了,TCP还有一个特性---面向字节流,这就导致了,目标主机读取到的内容可能并不是完整的源主机发送的内容。此处来填补这个知识。
小灵蛇
2024/09/07
770
Socket编程---TCP篇
c++ 网络编程(三)TCP/IP LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html
徐飞机
2018/09/30
1.3K0
c++ 网络编程(三)TCP/IP  LINUX/windows  进程间的通信原理与实现代码  基于多进程的服务端实现
c++ 网络编程(二)TCP/IP linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器
原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html
徐飞机
2018/09/30
3.8K0
c++ 网络编程(二)TCP/IP  linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器
【计网】基于TCP协议的Echo Server程序实现与多版本测试
我们上一篇文章讲解了利用udp协议实现一个简单的echo_server程序,将客户端的数据在服务端打印出来UDP协议。今天我们来讲解利用TCP协议实现的一个简单的echo_server程序,认识并熟悉各个接口的功能以及如何使用!
用户11316056
2024/11/19
1700
【计网】基于TCP协议的Echo Server程序实现与多版本测试
多进程服务器
先与客户端建立好连接, 每次监听到一个客户端之后,都需要产生一个子进程去处理这个连接,然后父进程继续去等待监听,唯一一个要注意的点就是要使用信号来监听子进程是否结束,从而对其进行回收,防止僵尸进程的产生。。。
买唯送忧
2021/09/14
4.7K0
服务器线程并发和进程并发
进程和线程的使用在前面博文已经讲述完毕,在完成一个最简单的服务器之后,就是要考虑下如何实现并发服务器了。 要实现服务的并发,只能通过进程和线程两种方式。 之前提到过listen_fd和connect_fd,listen用于监听是否有客户端连接,维护两个fd队列,没完成握手的和完成就绪的。 connect从就绪队列取描述符,这个connect_fd描述符将用于数据通信,所以要实现并发,就是将connect_fd分发到线程或进程上,由他们去独立完成通信。 在实际并发服务器应用场合,在IO层大多通过两个
Aichen
2018/05/18
3K0
TCP并发服务器(多进程与多线程)
我们在上一节写的TCP服务器只能处理单连接,在代码实现时,多进程并发服务器与非并发服务器在创建监听套接字、绑定、监听这几个步骤是一样的,但是在接收连接请求的时候,多进程并发服务器是这样实现的:父进程负责接受连接请求,一旦连接成功,将会创建一个子进程与客户端通信。示意图如下:
mindtechnist
2024/10/08
2380
TCP并发服务器(多进程与多线程)
RPC 服务器之【多进程描述符传递】高阶模型
今天老师要给大家介绍一个比较特别的 RPC 服务器模型,这个模型不同于 Nginx、不同于 Redis、不同于 Apache、不同于 Tornado、不同于 Netty,它的原型是 Node Cluster 的多进程并发模型。
老钱
2018/09/29
9430
RPC 服务器之【多进程描述符传递】高阶模型
【C++】基础:网络编程介绍与TCP&UDP示例
网络传输模型可以抽象为7个层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
DevFrank
2024/07/24
3950
【C++】基础:网络编程介绍与TCP&UDP示例
相关推荐
Tcp协议Socket编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文