C++回声服务器_6-多进程pipe版本服务器
在服务器多进程版本的基础上,使用管道来向一个子进程发送接收到的数据,该子进程将接收到的数据保存到文件中。客户端代码不变。
服务器代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <csignal>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>const int BUF_SIZE = 30;void error_handling(const char *messgae);
void read_childproc(int sig);// 接收一个参数,argv[1]为端口号
int main(int argc, char *argcv[]) {int server_sock, client_sock;struct sockaddr_in server_addr, client_addr;int fds[2]; // 管道描述符pid_t pid;struct sigaction act;socklen_t addr_size;int str_len, state;char buf[BUF_SIZE];if (argc != 2) {printf("Usgae : %s <port>\n", argcv[0]);exit(1);}act.sa_handler = read_childproc;sigemptyset(&act.sa_mask);act.sa_flags = 0;state = sigaction(SIGCHLD, &act, 0);server_sock = socket(PF_INET, SOCK_STREAM, 0);memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(atoi(argcv[1]));if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {error_handling("bind() error");}if (listen(server_sock, 5) == -1) {error_handling("listen() error");}pipe(fds);pid = fork();if (pid == 0) { // 负责保存数据到文件的子进程FILE *fp = fopen("echomsg.txt", "wt");char msgbuf[BUF_SIZE];int len;for (int i = 0; i < 10; ++i) {len = read(fds[0], msgbuf, BUF_SIZE);fwrite((void*)msgbuf, 1, len, fp);}fclose(fp);return 0;}while (1) {addr_size = sizeof(client_addr);client_sock =accept(server_sock, (struct sockaddr*)&server_addr, &addr_size);if (client_sock == -1) {continue;} else {puts("new client connected...");}pid = fork();if (pid == 0) {close(server_sock);while ((str_len = read(client_sock, buf, BUF_SIZE)) != 0) {write(client_sock, buf, str_len);write(fds[1], buf, str_len); // 发送数据给负责保存文件的子进程}close(client_sock);puts("client disconnected...");return 0;} else {close(client_sock);}}close(server_sock);return 0;
}
项目代码
github
参考
《TCP/IP网络编程》
C++回声服务器_6-多进程pipe版本服务器相关推荐
- 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本
此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 多进程版 1.1 思路 大体思路与上一篇的单进程版服务器–客户端类似,都是遵循下图: 多进程版本有以下几点需要注意: 由于TCP是点 ...
- 我的世界最新版本生存服务器ip,我的世界服务器古风小阁IP|纯净生存(1.15.2)
我的世界古风小阁服务器 ---- 服务器名称:古风小阁 ---- 服务器版本:1.15.2 ---- 服务器类型:纯净生存(无需下载专用客户端) ---- 服务器的IP:222.187.238.80: ...
- SVN 版本服务器搭配全过程详解(含服务端、客户端)
1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...
- Windows服务器下升级PHP版本的方法
这篇文章主要介绍了Windows服务器下升级PHP版本的方法,需要的朋友可以参考下 要升级PHP,我们首先得下载一个自动安装PHP组件到IIS中的软件,推荐的是星外公司开发的PHP安装包,我们可以到他 ...
- SVN 版本服务器搭配全过程详解(服务端、客户端)[转]
1.为什么要用VisualSVN Server,而不用Subversion? 回答: 因为如果直接使用Subversion,那么在Windows 系统上,要想让它随系统启动,就要封装SVN Serve ...
- 1高并发服务器:多进程服务器
1多进程并发服务器 使用多进程并发服务器时要考虑以下几点: A.父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) B.系统内创建进程个数(和内存大小相关) C.进程 ...
- 华为怎么安装服务器系统版本,服务器怎么安装操作系统版本
服务器怎么安装操作系统版本 内容精选 换一换 Atlas 800 训练服务器(型号 9010)安装上架.服务器基础参数配置.安装操作系统等操作请参见<Atlas 800 训练服务器 用户指南 ( ...
- 微软project服务器搭建,Project Professional 版本(Project Server 2010 设置)
Project Professional 版本 利用"Project Professional 版本",您可以指定将能够连接到 Project Server 2010 环境的 Pr ...
- Linux网络编程——tcp并发服务器(多进程)
https://blog.csdn.net/lianghe_work/article/details/46503895 一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多 ...
最新文章
- 【FPGA】SRIO例子程序仿真分析实践
- 4.10 风格代价函数-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- Sqlite error- INSERT failed: datatype mismatch
- tf.app.flags和tf.app.run的使用
- 几句话实现导航栏透明渐变 – iOS
- Git基础教程(四)
- Caused by: java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected
- Delphi- repeate
- 心理学与生活 - 文化与社会
- WallPaperAbyss爬虫
- 关于IE无法打开站点XX已终止操作问题
- js 谷歌浏览器 关闭当前页
- 老司机带你一分钟了解网络分析仪程控软件
- 深度学习硬件-GPU-显卡
- RTP协议封装H264/H265/AAC
- 飞翔的小鸟 c++ 2.0版
- 浅析音乐对现代社会的影响
- 涂抺mysql 李丙洋_涂抹MySQL
- java结合高德地图Api处理位置信息
- HTTP请求和响应全过程解析
热门文章
- ZendGuard-5_0_1 使用备忘
- 关于spring-data-jpa的排序问题
- AAuto如何设置定时器
- ASP.NET MVC模型绑定int超出范围时
- MyEclipse 修改 默认的 工作空间(转)
- 速修复!NSA 报告四个严重和高危 Exchange Server RCE 漏洞
- Windows DNS Server 远程代码执行漏洞 (CVE-2021-24078) 的详细原理分析
- 美国发布“几乎无法入侵”的国家量子互联网蓝图,计划十年内出原型
- [ZigBee] 10、ZigBee之睡眠定时器
- Percona XtraBackup 安装介绍篇