zoukankan      html  css  js  c++  java
  • 2019-2020-1 20175301 20175305 20175318 实验三 实时系统

    2019-2020-1 20175301 20175305 20175318 实验三 实时系统


    一 . 实验目的

    1.掌握并发程序操作实现
    2.学会比较不同进程的优缺点

    二 . 实验仪器

    嵌入式实验平台UP-TECH S24101

    三 . 实验内容

    1. 实验三-并发程序-1

    学习使用Linux命令wc(1)
    基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端
    客户端传一个文本文件给服务器
    服务器返加文本文件中的单词数

    实验代码

    server

    #include <stdio.h>  
    #include <sys/types.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <string.h>
    
    #define MYPORT 175301
    
    void main(){
        int clientfd;
        struct sockaddr_in remote_addr;
        char buffer[BUFSIZ];
        memset(&remote_addr, 0 , sizeof(remote_addr));
        remote_addr.sin_family=AF_INET;
        remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        remote_addr.sin_port=htons(MYPORT);
    
        if((clientfd=socket(PF_INET,SOCK_STREAM,0))<0){  
            perror("socket");  
        }
    
        if(connect(clientfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))<0){
            perror("connect");
        }
    
        int len;
        FILE *fp;
        char path[20];
        gets(path);
        fp=fopen(path, "r");
        char readch;
        int i=0;
        while((readch=fgetc(fp))!=EOF){
            if(i<1024){
                buffer[i]=readch;
                i++;
            }
            else{
                i=0;
                int n=send(clientfd, buffer, 1024, 0);
            }
        }
        fclose(fp);
        if(i!=0) 
            send(clientfd, buffer, i, 0);
        long wordscount;
        recv(clientfd, &wordscount, sizeof(long), 0);
        printf("%ld
    ", wordscount);
        close(clientfd);
    }
    

    client

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <pthread.h>
    
    #define MYPORT 175301
    pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
    int serverfd, clientfd;
    char buffer[BUFSIZ];
    
    void *wc(void *m){
        pthread_mutex_lock( &counter_mutex );
        int len, i;
        long wordscount=0;
        int flag=1;
        while(1){
            if((len=recv(clientfd, buffer, 1024, 0))>0){
                for(i=0; i<len; i++){
                    if(flag==0){
                        switch(buffer[i]){
                            case ' ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            default:
                                break;
                        }
                    }
                    if(buffer[i]== ' ' || buffer[i]=='
    ' || buffer[i]=='
    ') 
                        flag=1;
                    else 
                        flag=0;
                }
            }
            if(len<1024) 
                break;
        }
        send(clientfd, &wordscount, sizeof(long), 0);
        close(clientfd);
        pthread_mutex_unlock( &counter_mutex );
        return NULL;
    }
    void main(){
        pthread_t t;
        char arg[30];
    
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
    
        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sin_family=AF_INET;
        my_addr.sin_addr.s_addr=INADDR_ANY;
        my_addr.sin_port=htons(MYPORT);
    
        if((serverfd=socket(PF_INET, SOCK_STREAM, 0))==-1){
            perror("socket");
        }
    
        if(bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0){
            perror("bind");
        }
        listen(serverfd, 5);
        int addrlen=sizeof(struct sockaddr_in);
        while(1){
            if((clientfd=accept(serverfd, (struct sockaddr *)&remote_addr, &addrlen))<0){
                perror("accept");
            }
       
    }
    

    实验截图

    2. 实验三-并发程序-2

    使用多线程实现wc服务器并使用同步互斥机制保证计数正确
    上方提交代码
    下方提交测试
    对比单线程版本的性能,并分析原因

    实验代码

    server

    #include <stdio.h>  
    #include <sys/types.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <string.h>
    
    #define MYPORT 175301
    
    void main(){
        int clientfd;
        struct sockaddr_in remote_addr;
        char buffer[BUFSIZ];
        memset(&remote_addr, 0 , sizeof(remote_addr));
        remote_addr.sin_family=AF_INET;
        remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        remote_addr.sin_port=htons(MYPORT);
    
        if((clientfd=socket(PF_INET,SOCK_STREAM,0))<0){  
            perror("socket");  
        }
    
        if(connect(clientfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))<0){
            perror("connect");
        }
    
        int len;
        FILE *fp;
        char path[20];
        gets(path);
        fp=fopen(path, "r");
        char readch;
        int i=0;
        while((readch=fgetc(fp))!=EOF){
            if(i<1024){
                buffer[i]=readch;
                i++;
            }
            else{
                i=0;
                int n=send(clientfd, buffer, 1024, 0);
            }
        }
        fclose(fp);
        if(i!=0) 
            send(clientfd, buffer, i, 0);
        long wordscount;
        recv(clientfd, &wordscount, sizeof(long), 0);
        printf("%ld
    ", wordscount);
        close(clientfd);
    }
    

    client

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <pthread.h>
    
    #define MYPORT 175301
    pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
    int serverfd, clientfd;
    char buffer[BUFSIZ];
    
    void *wc(void *m){
        pthread_mutex_lock( &counter_mutex );
        int len, i;
        long wordscount=0;
        int flag=1;
        while(1){
            if((len=recv(clientfd, buffer, 1024, 0))>0){
                for(i=0; i<len; i++){
                    if(flag==0){
                        switch(buffer[i]){
                            case ' ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            default:
                                break;
                        }
                    }
                    if(buffer[i]== ' ' || buffer[i]=='
    ' || buffer[i]=='
    ') 
                        flag=1;
                    else 
                        flag=0;
                }
            }
            if(len<1024) 
                break;
        }
        send(clientfd, &wordscount, sizeof(long), 0);
        close(clientfd);
        pthread_mutex_unlock( &counter_mutex );
        return NULL;
    }
    void main(){
        pthread_t t;
        char arg[30];
    
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
    
        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sin_family=AF_INET;
        my_addr.sin_addr.s_addr=INADDR_ANY;
        my_addr.sin_port=htons(MYPORT);
    
        if((serverfd=socket(PF_INET, SOCK_STREAM, 0))==-1){
            perror("socket");
        }
    
        if(bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0){
            perror("bind");
        }
        listen(serverfd, 5);
        int addrlen=sizeof(struct sockaddr_in);
        while(1){
            if((clientfd=accept(serverfd, (struct sockaddr *)&remote_addr, &addrlen))<0){
                perror("accept");
            }
       
    }
    

    实验截图

    3. 实验三-并发程序-3

    交叉编译多线程版本服务器并部署到实验箱中
    PC机作客户端测试wc服务器
    提交测试截图

    实验代码

    server

    #include <stdio.h>  
    #include <sys/types.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <string.h>
    
    #define MYPORT 175301
    
    void main(){
        int clientfd;
        struct sockaddr_in remote_addr;
        char buffer[BUFSIZ];
        memset(&remote_addr, 0 , sizeof(remote_addr));
        remote_addr.sin_family=AF_INET;
        remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        remote_addr.sin_port=htons(MYPORT);
    
        if((clientfd=socket(PF_INET,SOCK_STREAM,0))<0){  
            perror("socket");  
        }
    
        if(connect(clientfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr))<0){
            perror("connect");
        }
    
        int len;
        FILE *fp;
        char path[20];
        gets(path);
        fp=fopen(path, "r");
        char readch;
        int i=0;
        while((readch=fgetc(fp))!=EOF){
            if(i<1024){
                buffer[i]=readch;
                i++;
            }
            else{
                i=0;
                int n=send(clientfd, buffer, 1024, 0);
            }
        }
        fclose(fp);
        if(i!=0) 
            send(clientfd, buffer, i, 0);
        long wordscount;
        recv(clientfd, &wordscount, sizeof(long), 0);
        printf("%ld
    ", wordscount);
        close(clientfd);
    }
    

    client

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <pthread.h>
    
    #define MYPORT 175301
    pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
    int serverfd, clientfd;
    char buffer[BUFSIZ];
    
    void *wc(void *m){
        pthread_mutex_lock( &counter_mutex );
        int len, i;
        long wordscount=0;
        int flag=1;
        while(1){
            if((len=recv(clientfd, buffer, 1024, 0))>0){
                for(i=0; i<len; i++){
                    if(flag==0){
                        switch(buffer[i]){
                            case ' ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            case '
    ':
                                wordscount++;
                                break;
                            default:
                                break;
                        }
                    }
                    if(buffer[i]== ' ' || buffer[i]=='
    ' || buffer[i]=='
    ') 
                        flag=1;
                    else 
                        flag=0;
                }
            }
            if(len<1024) 
                break;
        }
        send(clientfd, &wordscount, sizeof(long), 0);
        close(clientfd);
        pthread_mutex_unlock( &counter_mutex );
        return NULL;
    }
    void main(){
        pthread_t t;
        char arg[30];
    
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
    
        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sin_family=AF_INET;
        my_addr.sin_addr.s_addr=INADDR_ANY;
        my_addr.sin_port=htons(MYPORT);
    
        if((serverfd=socket(PF_INET, SOCK_STREAM, 0))==-1){
            perror("socket");
        }
    
        if(bind(serverfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))<0){
            perror("bind");
        }
        listen(serverfd, 5);
        int addrlen=sizeof(struct sockaddr_in);
        while(1){
            if((clientfd=accept(serverfd, (struct sockaddr *)&remote_addr, &addrlen))<0){
                perror("accept");
            }
       
    }
    
  • 相关阅读:
    tensorflow2.0 GPU和CPU 时间对比
    第一次使用FileZilla Server
    PremiumSoft Navicat 15 for Oracle中文破解版安装教程
    Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
    ng : 无法加载文件 D: odejs ode_global g.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
    angular
    Github上优秀的go项目
    win10---file explore 中remove quick access folder
    react--useEffect使用
    linux---cat 和 grep 的妙用
  • 原文地址:https://www.cnblogs.com/zhangtianyu/p/11924512.html
Copyright © 2011-2022 走看看