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));//设置套接字与sfd关联
        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;
    }
    

测试结果

  • 可以实现多个客户端同时连接服务器,服务器每接受一个客户就创建一个子进程,用户端断开后,进程由父进程自动回收子进程。

存在问题

  • 未进行错误处理,多用户连接时,可能会产生干扰。

原文地址:https://www.cnblogs.com/yanlei2018/p/8169416.html

时间: 2024-08-29 11:50:33

Linux多进程CS服务器简单实现的相关文章

linux系统vps服务器简单安全配置

虽然说linux 系统比windows安全性要高一些,不过一些简单的安全配置也是必要的.因为毕竟现在市面的破译工具太多了,如可以社会工程学你密码.那么就一起看学习下入门级安全配置吧. 工具/原料 linux 系统 vps或者服务器 DDos deflate 方法/步骤 第一.远程管理端口.市面上有很多工具采用字典方式套取你的管理员密码,我们至少可以创造一些麻烦出来.修改ssh 的登陆端口,默认端口是22.扫描字典穷举密码他们都是从默认的开始.如果你把端口改成4位数的也大大提高了他们的难度及时间.

Linux搭建ftp服务器简单教程

参考文章:https://www.waitig.com/linux-or-centos-install-vsftpd-and-setup-it.html 步骤概括如下: 安装:yum install vsftpd 操作: service vsftpd start|stop|restart 配置部分(重点): 1. 为了系统安全,一般会建立一个ftp用户,此用户不能登陆系统,且只能访问自己主目录下的文件. useradd  -d  /var/ftp/test     -g ftp -s   /sb

linux下DHCP服务器简单搭建

1.dhcp简介: Dynamic Host Configuration Protocol,动态主机配置协议.是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段. DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动.当DHCP服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置. DHCP具有以下功能:

linux网络编程-----&gt;高并发---&gt;多进程并发服务器

在做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accpet返回的新文件描述符) 系统内创建进程个数(与内

linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)

因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl. rcp rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp已经被scp取代了,常用scp来进行文件传输.要使用rcp,需要具备以下条件: (1)如果系统中有/etc/hosts 文件,应确保该文件包含要

linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)(zz)

linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl) 分类: linux2011-10-10 13:21 8773人阅读 评论(1) 收藏 举报 服务器linuxftp服务器文档commandssh 目录(?)[+] 因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl. r

linux下不同服务器间数据传输(wget,scp)

一.wget是Linux下最常用的http/ftp文件下载工具1.wget断点续传,只需要加上-c参数即可,例如:代码:wget-chttp://www.abc.com/abc.zip-Oabc.zip2.当服务器上的文件比本地指定目录下的文件更新时才下载,-P指定目录,-N表示检查文件文件是否更新代码:wget-N-P/hom 一.wget是Linux下最常用的http/ftp文件下载工具1.wget断点续传,只需要加上-c参数即可,例如:代码: wget -c http://www.abc.

Linux Apache web服务器 配置详细教程

3 Linux Apache web服务器 v2.4.29学习要点: 1.apache用途,工作模式,httpd.conf的配置重要参数2.虚拟主机 工作模式的参数优化 3.1 Apache 概述: 3.1.1 Apache 概述Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中.同时Apache音译为

Linux 高并发服务器

高并发服务器 一.多进程并发服务器 1. 实现示意图 2. 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程个数(与内存大小相关) 进程创建过多是否降低整体服务性能(进程调度) 3. 使用多进程的方式, 解决服务器处理多连接的问题:     (1)共享 读时共享, 写时复制 文件描述符 内存映射区 -- mmap     (2)父进程 的角色是什么? 等待接受客户端连接 -- accept 有链接: 创建一