Linux多进程CS服务器简单测试
Linux多进程CS服务器简单实现
server端
多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端。
- 代码实现
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/wait.h> #define SERV_IP "127.0.0.1"
#define SERV_PORT 8000 void wait_child(int signo)//回收子进程函数
{
while(waitpid(0, NULL, WNOHANG)>0);
return;
}
int main(int argc,char *argv[])
{
pid_t pid;//进程ID
int sfd, cfd;//接收连接的sfd,和client通讯的cfd
struct sockaddr_in serv_addr, clie_addr;//创建服务器和客户端结构体
socklen_t clie_addr_len;//客户端结构体长度
char buf[BUFSIZ], clie_IP[BUFSIZ];//buf存放接收到的数据
int n , i;//读取的数据数n, 循环因子i sfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字 bzero(&serv_addr, sizeof(serv_addr));//清零
serv_addr.sin_family = AF_INET;//设置协议族为IPv4
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置网卡为本地任何有效网卡
//inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
serv_addr.sin_port = htons(SERV_PORT);//设置端口 bind(sfd, (struct sockaddr * )&serv_addr, sizeof(serv_addr));//设置绑定
listen(sfd, 128);//设置未完成accept的最大数量.开始监听.
while(1)//循环接收客户端连接
{
clie_addr_len = sizeof(clie_addr);//初始化客户端结构体长度
cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//接收客户端连接
printf("client IP:%s, port:%d\n", inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie_addr.sin_port));
pid = fork();//创建新进程
if(pid< 0)//出错
{
perror("fork error");
exit(1);
}
else if(pid == 0)//子进程
{
close(sfd);//子进程中先关闭父进程文件描述符
break;
}
else if(pid>0)//父进程
{
close(cfd);//父进程中先关闭子进程文件描述符
signal(SIGCHLD, wait_child);//注册信号用于回收已结束的子进程
}
}
if(pid == 0)//以下是子进程真正的业务处理部分
{
while(1)//循环处理客户端业务
{
n = read(cfd, buf, sizeof(buf));
if(n == 0)//如果read返回0, 说明客户端已断开连接
{
close(cfd);//关闭客户端文件描述符
return 0;
}
else if(n == -1)//出错
{
perror("read error");
exit(1);
}
else
{
write(STDOUT_FILENO, buf, n);
for(i= 0; i< n;++i)
{
buf[i] = toupper(buf[i]);
}
write(cfd, buf, n);
}
}
}
return 0;
}
client端
连接server端,发送字符串,将收到的字符串打印出来(即:与nc命令功能相同)。
- 代码实现
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MAXLINE 8192
#define SERV_PORT 8000 int main(int argc,char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n; sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT); connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(fgets(buf, MAXLINE, stdin)!=NULL)
{
write(sockfd, buf, strlen(buf));
n =Read(sockfd, buf, MAXLINE);
if(n ==0)
{
printf("the other side has been closed.\n");
break;
}
else
write(STDOUT_FILENO, buf, n);
}
close(sockfd);
return 0;
}
测试结果
- 可以实现多个客户端同时连接服务器,服务器每接受一个客户就创建一个子进程,用户端断开后,进程由父进程自动回收子进程。
存在问题
- 仅供学习参考,未进行错误处理。多用户连接时,可能产生读写中断干扰。
Linux多进程CS服务器简单测试的更多相关文章
- Linux配置全局jdk以及Tomcat服务器简单测试
Linux配置全局jdk 1.确保相应文件夹下有apache-tomcat和jdk的压缩文件 注意:jdk文件必须为适应Linux版本的文件 (如果已经有了相应文件,可以跳过以下第2-3个步骤) 2. ...
- Tomcat服务器简单测试jsp文件和html文件
在tomcat里面的webapps文件夹下面新建一个test文件, 写一个test.html的文件,一个test.jsp的文件,两个文件的内容全是:2+2=<%=2+2%> 重新启动Tom ...
- Linux搭建ftp服务器简单教程及使用方法
参考文章:https://www.waitig.com/linux-or-centos-install-vsftpd-and-setup-it.html 步骤概括如下: 安装:yum install ...
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
一.http_load程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把 ...
- linux sumba服务器简单配置
使用samba设置linux和windows直接简单的文件共享 前提: 1.linux和windows已经可以互相ping同 2.已经安装好smb 查看是否安装smb rpm -aq|grep smb ...
- springboot+nginx+https+linux实现负载均衡加域名访问简单测试
把springboot项目打包成三个jar包,并指定端口为 14341,14342,14343 下载腾讯云免费ssl证书,解压后会出现如下图文件夹 把nginx文件夹下的 .crt 和 .key文件复 ...
- linux测试带宽命令,Linux服务器网络带宽测试iperf
linux测试带宽命令,Linux服务器网络带宽测试iperf必须先运行iperf serveriperf -s -i 2客户端iperf -c 服务端IP地址 iperf原理解析 iperf工具可以 ...
- Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试
这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功. 一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有 ...
- [转]linux C/C++服务器后台开发面试题总结
linux C/C++服务器后台开发面试题总结 https://www.cnblogs.com/nancymake/p/6516933.html 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别 ...
随机推荐
- 贪心算法和动态规划[zz]
http://www.cnblogs.com/asuran/archive/2010/01/26/1656399.html 贪心算法 1.贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过 ...
- Python学习---迭代器学习1210
可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的generator fun ...
- Connection to linux server with ORACLE SQL DEVELOPER
1.Link name is random 2.username and password is database account 3.host name is ip address ifconf ...
- Vim 编辑器及其基本操作
实验楼某些课程有用 Vim 编辑器来写代码,因此有了这篇博客,据说是上古神器,当然主要目的是基本操作. Vim 编辑器 Vim(Vi IMprove) 是 Linux 系统上的最著名的文本/代码编辑器 ...
- 自定义控件(视图)2期笔记11:View的滑动冲突之 概述
1. 引入: 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 那到底是为什么会产 ...
- 【[HNOI2012]矿场搭建】
抄题解真开心 我真是越来越菜了 这是点双的板子题,于是求出所有点双,之后讨论 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个 如果有两 ...
- StackExchange.Redis学习笔记(一) Redis的使用初探
Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...
- [转]VC++获取文件大小集锦
方法一: WIN32_FIND_DATA fileInfo; HANDLE hFind; DWORD fileSize; const char *fileName = 文件的路径及名字; hFind ...
- DPDK安装依赖项合集 环境合集
前言 在dpdk编译过程中,由于一些依赖项的限制,dpdk在纯净的系统上安装需要花一些功夫.本文总结了编译dpdk所需的依赖项,并归纳了安装合集,在安装过程上可以省下大量的搜索时间. 使用系统 ubu ...
- CCF认证201803-2 碰撞的小球 java代码实现。
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...