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服务器简单测试的更多相关文章

  1. Linux配置全局jdk以及Tomcat服务器简单测试

    Linux配置全局jdk 1.确保相应文件夹下有apache-tomcat和jdk的压缩文件 注意:jdk文件必须为适应Linux版本的文件 (如果已经有了相应文件,可以跳过以下第2-3个步骤) 2. ...

  2. Tomcat服务器简单测试jsp文件和html文件

    在tomcat里面的webapps文件夹下面新建一个test文件, 写一个test.html的文件,一个test.jsp的文件,两个文件的内容全是:2+2=<%=2+2%> 重新启动Tom ...

  3. Linux搭建ftp服务器简单教程及使用方法

    参考文章:https://www.waitig.com/linux-or-centos-install-vsftpd-and-setup-it.html 步骤概括如下: 安装:yum install ...

  4. Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍

    一.http_load程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把 ...

  5. linux sumba服务器简单配置

    使用samba设置linux和windows直接简单的文件共享 前提: 1.linux和windows已经可以互相ping同 2.已经安装好smb 查看是否安装smb rpm -aq|grep smb ...

  6. springboot+nginx+https+linux实现负载均衡加域名访问简单测试

    把springboot项目打包成三个jar包,并指定端口为 14341,14342,14343 下载腾讯云免费ssl证书,解压后会出现如下图文件夹 把nginx文件夹下的 .crt 和 .key文件复 ...

  7. linux测试带宽命令,Linux服务器网络带宽测试iperf

    linux测试带宽命令,Linux服务器网络带宽测试iperf必须先运行iperf serveriperf -s -i 2客户端iperf -c 服务端IP地址 iperf原理解析 iperf工具可以 ...

  8. Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试

    这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功. 一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有 ...

  9. [转]linux C/C++服务器后台开发面试题总结

    linux C/C++服务器后台开发面试题总结  https://www.cnblogs.com/nancymake/p/6516933.html 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别 ...

随机推荐

  1. 贪心算法和动态规划[zz]

    http://www.cnblogs.com/asuran/archive/2010/01/26/1656399.html 贪心算法 1.贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过 ...

  2. Python学习---迭代器学习1210

    可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的generator fun ...

  3. 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 ...

  4. Vim 编辑器及其基本操作

    实验楼某些课程有用 Vim 编辑器来写代码,因此有了这篇博客,据说是上古神器,当然主要目的是基本操作. Vim 编辑器 Vim(Vi IMprove) 是 Linux 系统上的最著名的文本/代码编辑器 ...

  5. 自定义控件(视图)2期笔记11:View的滑动冲突之 概述

    1. 引入: 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了. 那到底是为什么会产 ...

  6. 【[HNOI2012]矿场搭建】

    抄题解真开心 我真是越来越菜了 这是点双的板子题,于是求出所有点双,之后讨论 如果点双里之有一个割点,那么如果这个割点炸了,这个点双就出不去了,于是我们得在这个点双内部除了这个割点位置放一个 如果有两 ...

  7. StackExchange.Redis学习笔记(一) Redis的使用初探

    Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...

  8. [转]VC++获取文件大小集锦

    方法一: WIN32_FIND_DATA fileInfo; HANDLE hFind; DWORD fileSize; const char *fileName = 文件的路径及名字; hFind ...

  9. DPDK安装依赖项合集 环境合集

    前言 在dpdk编译过程中,由于一些依赖项的限制,dpdk在纯净的系统上安装需要花一些功夫.本文总结了编译dpdk所需的依赖项,并归纳了安装合集,在安装过程上可以省下大量的搜索时间. 使用系统 ubu ...

  10. CCF认证201803-2 碰撞的小球 java代码实现。

    问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...