作业-11.24

news2024/11/15 17:24:55

1、多线程并发服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>

#define ERRLOG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

#define N 128

typedef struct _MSG{
    int acceptfd;
    struct sockaddr_in clientaddr;
}msg_t;

void *deal_read_write(void *arg)
{
    msg_t msg = *(msg_t *)arg;
    printf("客户端[%s:%d]连接到服务器..\n", inet_ntoa(msg.clientaddr.sin_addr), ntohs(msg.clientaddr.sin_port));
    int nbytes = 0;
    char buff[N] = {0};
    while(1)
    {
        memset(buff, 0, N);
        if(-1 == (nbytes = recv(msg.acceptfd, buff, N, 0)))
        {
            perror("recv");
            break;
        }
        else if(!nbytes)
        {
            printf("客户端[%s:%d]断开了连接..\n", inet_ntoa(msg.clientaddr.sin_addr), ntohs(msg.clientaddr.sin_port));
            break;
        }
        if(!strncmp(buff, "quit", 4))
        {
            printf("客户端[%s:%d]退出了..\n", inet_ntoa(msg.clientaddr.sin_addr), ntohs(msg.clientaddr.sin_port));
            break;
        }
        printf("客户端[%s:%d]发来数据[%s]\n", inet_ntoa(msg.clientaddr.sin_addr), ntohs(msg.clientaddr.sin_port), buff);
        strcat(buff, "-->\n");
        if(-1 == send(msg.acceptfd, buff, N, 0))
        {
            perror("send");
           break;
        }
    }
    close(msg.acceptfd);
    pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
    if(3 != argc)
    {
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(-1);
    }

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == sockfd)
    {
        ERRLOG("socket");
        return -1;
    }

    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_port = htons(atoi(argv[2]));

    socklen_t serveraddr_len = sizeof(serveraddr);

    if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len))
    {
        ERRLOG("bind");
        return -1;
    }

    if(-1 == listen(sockfd, 5))
    {
        ERRLOG("listen");
        return -1;
    }

    struct sockaddr_in clientaddr;
    memset(&clientaddr, 0, sizeof(clientaddr));
    socklen_t clientaddr_len = sizeof(clientaddr);

    int acceptfd = 0;
    pthread_t tid = 0;
    msg_t msg;
     int err_code = 0;

    while(1)
    {
        if(-1 == (acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_len)))
        {
            ERRLOG("accept");
            return -1;
        }
        msg.acceptfd = acceptfd;
        msg.clientaddr = clientaddr;
        if(0 != (err_code  = pthread_create(&tid, NULL, deal_read_write, &msg)))
        {
            printf("pthread_create error %s\n", strerror(err_code));
            return -1;
      }
        if(0 !=  (err_code = pthread_detach(tid)))
        {
            printf("pthread_detach error %s\n", strerror(err_code));
            return -1;
      }
    }

    close(sockfd);

    return 0;
}

 

2、多进程并发服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/wait.h>

#define ERRLOG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

#define N 128

void sig_function()
{
    wait(NULL);
}

int main(int argc, const char *argv[])
{
    if(3 != argc)
    {
        printf("Usage : %s <IP> <port>\n", argv[0]);
        return -1;
    }

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0)
    {
        ERRLOG("socket");
        return -1;
    }

    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_port = htons(atoi(argv[2]));

    socklen_t serveraddr_len = sizeof(serveraddr);

    if(bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
    {
        ERRLOG("bind");
        return -1;
    }

    if(listen(sockfd, 5) < 0)
    {
        ERRLOG("listen");
        return -1;
    }

    signal(SIGUSR1, sig_function);

    struct sockaddr_in clientaddr;
    memset(&clientaddr, 0, sizeof(clientaddr));
    socklen_t clientaddr_len = sizeof(clientaddr);

    int acceptfd = 0;
    pid_t pid = 0;

    while(1)
    {
        if((acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_len)) < 0)
        {
            ERRLOG("accept");
            return -1;
        }

        if((pid = fork()) < 0)
        {
            ERRLOG("fork");
            return -1;
        }
        else if(!pid)
        {
            printf("客户端[%s:%d]连接到服务器..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
            int nbytes = 0;
            char buff[N] = {0};
            while(1)
            {
                memset(buff, 0, N);
                if((nbytes = recv(acceptfd, buff, N, 0)) < 0)
                {
                    ERRLOG("recv");
                    return -1;
                }
                else if(!nbytes)
                {
                    printf("客户端[%s:%d]断开了连接..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
                    break;
                }
                if(!strncmp(buff, "quit", 4))
                {
                    printf("客户端[%s:%d]退出了..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
                    break;
                }
                printf("客户端[%s:%d]发来数据[%s]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buff);
                strcat(buff, "--hqyj");
                if(send(acceptfd, buff, N, 0) < 0)
                {
                    ERRLOG("send");
                    return -1;
                }
            }
            close(acceptfd);
            kill(getppid(), SIGUSR1);
            return 0;
        }
        else if(pid > 0)
        {
            close(acceptfd);
        }
    }

    close(sockfd);

    return 0;
}

 

 

3、fttp下载上传

#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__:", __LINE__);\
    perror(msg);\
}while(0)

int do_download(int sfd, struct sockaddr_in sin);
int do_upload(int sfd, struct sockaddr_in sin);

int main(int argc, const char *argv[])
{
    if(argc != 3)
    {
        printf("please--> %s <IP> <PORT>\n", argv[0]);
        return -1;
    }

    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;      
    sin.sin_port        = htons(atoi(argv[2]));  
    sin.sin_addr.s_addr = inet_addr(argv[1]);

    char c = 0;
    int flag = 1;
    while(1)
    {
        system("clear");
        printf("**********************\n");
        printf("*******1.下载*********\n");
        printf("*******2.上传*********\n");
        printf("*******3.退出*********\n");
        printf("**********************\n");
        printf("请输入>>>");

        c = getchar();
        while(getchar()!=10);

        switch(c)
        {
        case '1':
            do_download(sfd, sin);
            break;
        case '2':
            do_upload(sfd, sin);
            break;
        case '3':
            flag = 0;
            break;
        default:
            printf("输入错误,请重新输入\n");
        }

        if(!flag)
        {
            break;
        }
        printf("输入任意字符清屏>>>");
        while(getchar() !=10);
    }


    close(sfd);
    return 0;
}

int do_download(int sfd, struct sockaddr_in sin)
{
    char filename[20] = "";
    char buf[516] = "";

    bzero(buf, sizeof(buf));
    printf("请输入要下载的文件名>>>");
    fgets(filename, sizeof(filename), stdin);
    filename[strlen(filename)-1] = 0;

    int size = sprintf(buf, "%c%c%s%c%s%c", 0, 1, filename, 0, "octet", 0);
    if(sendto(sfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("sendto");
        return -1;
    }

    int fd = -1, flag = 0;    
    socklen_t addrlen = sizeof(sin);
    ssize_t res = 0;

    unsigned short num = 0;     

    while(1)
    {
        bzero(buf, sizeof(buf));
        res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);
        if(res < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }

        if(3 == buf[1])
        {
            if(htons(num+1) == *(unsigned short*)(buf+2))
            {
                num++;

                if(0 == flag)
                {
                    fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664);
                    if(fd < 0)
                    {
                        ERR_MSG("open");
                        return -1;
                    }
                    flag = 1;
                }

                if(write(fd, buf+4, res-2-2) < 0)
                {
                    ERR_MSG("write");
                    return -1;
                }

                buf[1] = 4;
                if(sendto(sfd, buf, 4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
                {
                    ERR_MSG("sendto");
                    return -1;
                }

                if(res-2-2 < 512)
                {
                    printf("%s 文件下载完毕\n", filename);
                    break;
                }
            }
        }
        else if(5 == buf[1])
        {
            fprintf(stderr, "错误码:%d 错误信息:%s\n", ntohs(*(unsigned short*)(buf+2)), buf+4);
            break;
        }
    }

    close(fd);
    return 0;
}

int do_upload(int sfd, struct sockaddr_in sin)
{
    char str[1000] = "";
    char *ptr = str;
    short int *ptr1 = (short int*)ptr;
    *ptr1 = htons(2);
    char *ptr2 = ptr+2;

    char filename[128] = "";
    printf("请输入要上传的文件名>>>");
    scanf("%s",filename);
    getchar();
    strcpy(ptr2,filename);

    char *ptr3 = ptr2+strlen(ptr2)+1;
    strcpy(ptr3,"octet");

    int size = 2+strlen(ptr2)+1+strlen(ptr3)+1;
    if(sendto(sfd, str, size, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("sendto");
        return -1;
    }
    printf("sendto success\n");

    char str1[6] = "";                  
    struct sockaddr_in rcv_addrmsg;
    socklen_t addrlen = sizeof(rcv_addrmsg);


    if(recvfrom(sfd,str1,sizeof(str1),0,(struct sockaddr*)&rcv_addrmsg,&addrlen) < 0)
    {
        ERR_MSG("recvfrom");
        return -1;
    }

    int fd = open(filename,O_RDONLY);
    if(fd<0)
    {
        ERR_MSG("open");
        return -1;
    }

    short int num = 1;                       
    char str2[1024] = "";


    ssize_t rts = 0;
    while(1)
    {
        char *sjb = str2;
        short int *sjb1 = (short int*)sjb;
        *sjb1 = htons(3);

        short int *sjb2 = (short int*)(sjb+2);
        *sjb2 = htons(num);

        char *sjb3 = (str2+4);

        rts = read(fd,sjb3,512);
        int sjblen = rts+4;

        if(sendto(sfd,str2,sjblen,0,(struct sockaddr*)&rcv_addrmsg,addrlen) < 0)
        {
            ERR_MSG("sendto");
            return -1;
        }

        bzero(str1,sizeof(str1));
        if(recvfrom(sfd,str1,sizeof(str1),0,(struct sockaddr*)&rcv_addrmsg,&addrlen) < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }

        char *ack = str1;
        short int *err;
        err = (short int*)ack;
        if(ntohs(*err) == 5)
        {
            printf("error:%s\n",(char*)(err+2));
            return -1;
        }

        short int *kbh = (short int*)str1;
        if(ntohs(*(kbh+1)) != num)
        {
            continue;
        }

        num++;

        if(rts != 512)
        {
            printf("send file success!\n");
            break;
        }

    }
}

        下载

 

        上传

                上传前

                 上传后

                 终端

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCE | 间歇性禁食增强抗癌疗效

越来越多的研究表明&#xff0c;“禁食”不仅与免疫系统调控 、血糖调节有关&#xff0c;还对多种疾病的治疗有改善效果&#xff0c;如心血管疾病和癌症等。这里的“禁食”与节食不同&#xff0c;一般指的是间歇性禁食&#xff0c;包括多种方案&#xff0c;例如 FMD (Fasting-m…

LeetCode135. 分发糖果(贪心算法)

1 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…

pyinstaller打包教程(pycharm)

PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具&#xff0c;支持 Windows/Linux/MacOS三大主流平台&#xff0c;能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件&#xff0c;从而允许最终用户在无需安装 Python 的情况下执行应用程序。 PyInstalle…

IOS安全测试学习-DVIA-v2

前言 为学习IOS知识并加深理解&#xff0c;故通过IOS漏洞靶场来直接体现IOS环境中的常见漏洞。 环境准备 iPhone X ios 13.4.1 已越狱 MacOS Big Sur 11.0 Bate 虚拟机 DVIA-v2 IOS 漏洞靶场app grapefruit、objection #pip3 install frida、pip3 install frida-tools、sudo …

【App自动化测试】(五)移动端自动化常用的元素定位工具——Uiautomatorviewer、 ATX WEditor、Appium Inspector

目录1. uiautomatorviewer1.1 uiautomatorviewer 的安装1.2 uiautomatorviewer 工具功能介绍1.3 uiautomatorviewer 的使用方法2. ATX WEditor2.1 ATX WEditor的安装2.2 ATX WEditor 功能介绍2.3 ATX WEditor 的使用3. Appium Inspector3.1 Appium Inspector安装与运行3.2 Appi…

【AWS系列】第八讲:AWS Serverless之S3

目录 序言 1.基础介绍 1.1 概念介绍 1.2 原理介绍 1.3 应用场景 1.3.1 构建数据湖 1.3.2 备份和还原关键数据 1.3.3 以最低成本存档数据 1.3.4 运行云原生应用程序 1.4 S3 的功能 1.4.1 存储类 1.4.2 存储管理 1.4.3 访问管理 2 使用方法 2.1 创建存储桶 ​2.2…

用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

day074:XML、XML的解析

目录 一、XML 1.什么是XML 2.XML作用 3.XML语法规则 4.XML文件代码示例 二、解析XML文件 1.解析XML 2.常用的解析思想 &#xff08;1&#xff09;DOM思想 &#xff08;2&#xff09;图解 3.XML解析工具 一、XML 1.什么是XML XML&#xff08;EXtensible Markup Lan…

【已解决】CentOS7等linux系统时区时间不对显示误差8小时

文章目录问题解决处理时区问题date查看时间、时区timedatectl查看时间、时区查看localtime设置时区处理时间问题问题 中国使用的是东八区上海时间&#xff0c;而linux服务器&#xff0c;一般默认是0时区UTC&#xff0c;所以需要将时区改为东八区CST将时区改为东八区后&#xf…

机器学习-决策树算法

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录1. 决策树算法1.1. 什么是决策树/判定树1.2. 决策树归纳算法1.3. 熵概念1.4. 具体算法1.5. 决策树剪枝1.6. 连续值与缺失值处理1.6…

MCE | 正确认识阿尔茨海默病

什么是阿尔茨海默病 (Alzheimer Disease, AD)&#xff1f; 1907 年德国神经病理学家阿尔茨海默 (Alois Alzheimer) 仔细描述了一名具有进行性痴呆表现的 51 岁妇女 (Auguste Deter) 的症状&#xff1a; “她的记忆力严重受损。如果向她显示了对象&#xff0c;她会正确地命名它…

还在调API写所谓的AI“女友”,唠了唠了,教你基于python咱们“new”一个(深度学习)

文章目录前言停用词闲聊语料基础知识词的表示表达one-hot编码词嵌入大致原理实现简单版复杂版如何训练转换后的形状RNN循环网络RNNRNN投影图RNN是三维立体的LSTM&GRU构建数据配置数据集准备分词划分数据集加载模型搭建基本概念Encoder搭建DecoderAttention机制decoder与bea…

赫夫曼树赫夫曼编码的创建

目录基础知识点最优二叉树如何构造赫夫曼树赫夫曼编码编码与压缩文件代码结构体设计创建赫夫曼树创建构建赫夫曼编码基础知识点 赫夫曼树又称为最优树&#xff0c;是一种带权路径长短最短的树&#xff0c;有着广泛的应用。 最优二叉树 我们给出路径和路径长度的概念。从树的…

盘点面试常见的设计类算法问题

设计问题也是一种很重要的考察类型&#xff0c;特征是整体难度不大&#xff0c;但是要求结构合理、复用性好、考虑周全&#xff0c;代码规范等等。有些面试官不喜欢烧脑的动态规划等问题&#xff0c;就喜欢设计题&#xff0c;笔者曾经在面试微博和猿辅导都遇到过类似的问题。这…

【操作系统】2.1 进程与线程总结

2.1.1 操作系统之进程的定义、特征、组成、组织 2.1.1 操作系统之进程的定义、特征、组成、组织_StudyWinter的博客-CSDN博客 进程由程序段、数据段、进程控制块&#xff08;PCB&#xff09;三部分组成。 进程是进程实体的运行过程&#xff0c;是系统进行资源分配和资源调度的…

隆化的大米排之首 国稻种芯·中国水稻节:河北承德十大特产

隆化的大米排之首 国稻种芯中国水稻节&#xff1a;河北承德十大特产 中新网河北新闻10月8日电 (张桂芹 王思明) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xf…

python基础项目实战-俄罗斯方块

一、俄罗斯方块游戏设计分析: 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛,人所共知。俄罗斯方块游戏基本规则是油4个小方块组成的7种不同的规则图形…

DevOps持续部署的关键要素

当有版本通过持续集成流水线进行构建之后&#xff0c;就可以将其部署至某个具体的环境&#xff0c;这就需要自动化部署技术&#xff0c;将这个自动化部署和持续集成流水线连接起来&#xff0c;就可实现持续部署。如图1所示&#xff0c;实现持续部署的前提是至少拥有一条完整的自…

mipi phy理解

MIPI 接口广泛用于摄像头,和显示部分;PHY 属于 MIPI 接口的最底层部分,也就是物理层,直接涉及到物理连线,信号传输等等,要搞清楚 MIPI 的数据传送,那么从 PHY 入手了解,是一个不错的选择;在 PHY 上,只负责定义数据物理层的收发标准; MIPI 的 PHY 分为了 3 种: D-P…

BartForConditionalGeneration的使用细节

输入到 BartForConditionalGeneration 类的各个参数是什么意思&#xff1f; decoder_input_ids 是必须要以 <s> 开头的。这个参数可以自己生成然后传入到模型中&#xff0c;也可以交由代码自己生成&#xff08;一般会根据label右移一位再补0&#xff09; case 1&#x…