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. 平均负载(Load average)

    load average 的含义平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. top命令中load average显示的是最近1分钟.5分钟和1 ...

  2. 笔记:Xen虚拟机如何迁移到KVM上?

    众所周知如果是在Linux上使用虚拟化技术的话,就会有基于Xen Hypervisor部署一个系统的机会.因为基于内核的虚拟机(KVM:Kernel-Based Virtual Machine)已经逐 ...

  3. Linux入门-8 Linux系统启动详解

    系统启动流程 BIOS MBR GRUB KERNEL INIT 单用户修改root密码 GRUB加密 系统启动流程 BIOS MBR: Boot Code 执行引导程序 - GRUB 加载内核 执行 ...

  4. Excel操作之级联菜单

    设置级联菜单主要用的是excel的数据验证功能.下面以简单的设置城市选择框为例: 1.准备好数据 2.给所有省份起个名称(例如:省份),然后同样方法给每个省份所对应的城市以其省份命名,(例如:南京.苏 ...

  5. 使用Visual Studio Code开发Arduino

    首发于MSPrecious成长荟 https://zhuanlan.zhihu.com/p/30868224 使用Visual Studio Code开发Arduino 1.下载安装 VS Code ...

  6. Git commit comment 汇总标准

    参考汇总互联网其它文章建议,结合PEP 257 Docstring Conventions的描述,总结的Git 注释风格,作为个人执行的标准.内容如下: 遵循标准: 1,所有注释尽量坚持使用英文,如果 ...

  7. [零基础学JAVA]Java SE面向对象部分.面向对象基础(03)

     1.静态变量的使用 2.单例模式的使用. 3.构造方法的私有化. 4.string的使用,两种构造的不同. 小的记忆错误: · 数组的长度:数组名称.length     这个没()哈~~ · 字符 ...

  8. 解决 php7下 igbinary_unserialize_ref: invalid reference 的bug

    最近组内升级了PHP7,某个接口偶发502,看了下php的错误日志如下: igbinary_unserialize_ref: invalid reference >= Memcached::ge ...

  9. Linux环境搭建多项目SVN

    1.安装SVN #yum install subversion 2.创建版本库文件夹 #mkdir -p /var/svn/repos/pro1 (/var/svn/repos是根路径,pro1是项目 ...

  10. 7、Spring -Cloud-路由网管Spring Cloud Zuul

    7.1.为什么需要Zuul Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用: 7.2.Zuul的工作原理 Zuul 是通过 Servlet 来实现的, Zuul 通过自定义的 Zuu!S ...