码迷,mamicode.com
首页 > 其他好文 > 详细

2019-2020-1 20175202 20175204 20175216 《信息安全系统设计基础》实验三 并发程序

时间:2019-11-18 14:28:43      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:dsc   stream   get   oid   技术   虚拟   连接   设计   注意   

#2019-2020-1 20175202 《信息安全系统设计基础》实验三 并发程序 ##实验小组成员 20175202葛旭阳 20175204张湲祯 20175216张雪原

###《信息安全系统设计基础》实验三【并发程序】

实验小组成员:20175202 葛旭阳 20175204 张湲祯 20175216 张雪原

###任务一【并发程序-1】 一、实验任务

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

二、实验步骤: 1.在虚拟机中同时打开两个终端,一个作为客户端,一个作为服务器端; 2.将文件test1.txt和文件test2.txt复制到虚拟机中; 3.编译并运行客户端和服务器端代码; 4.首先运行服务器端代码,连接到服务器; 5.运行客户端代码,发送请求; 6.输入要请求的.txt文件名。 7.服务器端代码如下:

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

#define MYPORT 175202

void main(){
    int serverfd, clientfd;
    struct sockaddr_in my_addr;
    struct sockaddr_in remote_addr;

    char buffer[BUFSIZ];
    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");
    }
    printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr));
    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 ‘\n‘:
                            wordscount++;
                            break;
                        case ‘\r‘:
                            wordscount++;
                            break;
                        default:
                            break;
                    }
                }
            if(buffer[i]== ‘ ‘ || buffer[i]==‘\n‘ || buffer[i]==‘\r‘) flag=1;
            else flag=0;
            }
        }
        if(len<1024) break;
    }
    send(clientfd, &wordscount, sizeof(long), 0);
    close(clientfd);
    }
    close(serverfd);
}

8.客户端代码如下:

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

#define MYPORT 175202

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\n", wordscount);
    close(clientfd);
}

二、实验结果截图: 技术图片

###任务二 【并发程序-2】 一、实验任务: 1.使用多线程实现wc服务器并使用同步互斥机制保证计数正确; 2.上方提交代码; 3.下方提交测试; 4.对比单线程版本的性能,并分析原因。

二、实验步骤: 1.在虚拟机中同时打开两个终端,一个作为客户端,一个作为服务器端; 2.将文件test1.txt和文件test2.txt复制到虚拟机中; 3.编译并运行客户端和服务器端代码; 4.首先运行服务器端代码,连接到服务器; 5.运行客户端代码,发送请求; 6.输入要请求的.txt文件名; 7.服务器端代码如下:

#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 165318
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 ‘\n‘:
                            wordscount++;
                            break;
                        case ‘\r‘:
                            wordscount++;
                            break;
                        default:
                            break;
                    }
                }
                if(buffer[i]== ‘ ‘ || buffer[i]==‘\n‘ || buffer[i]==‘\r‘) 
                    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");
        }
        printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr));
        pthread_create(&t, NULL, &wc, NULL);
        pthread_join(&t, NULL);
    }
    close(serverfd);
}

8.客户端代码如下:

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

#define MYPORT 165318

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\n", wordscount);
    close(clientfd);
}

三、实验结果截图:

技术图片

###任务三 【并发程序-3】 一、实验任务: 1.交叉编译多线程版本服务器并部署到实验箱中; 2.PC机作客户端测试wc服务器; 3.提交测试截图。

二、实验步骤:

三、实验结果截图:

###实验总结

本次实验首先遇到了很多问题,首先是实验箱的问题:一、实验箱接入电源后,显示灯不亮,更换数个实验箱才可以正常使用; 二、实验箱接入电源都无误后,实验箱和电脑ping不通;原因:网络环境应为桥连接,而不是nat连接;不同主机不同实验箱有的可以直接ping通,有的不可以,同一主机换了实验箱有时候也ping不通,但检查过后虚拟机网关是相同的,连接模式也为桥接,不知道什么原因ping不通,更换一个实验箱则可以正常进行实验。 三、在设置NFS进行挂载时,一定要注意/home/linux/Linux_20175202_20175204_20175216 *(rw,sync,no_root_squash,no_subtree_check)中不能丢掉目录/home/linux(不同目录位置不同)否则会导致后续在超级终端中复制失败。

2019-2020-1 20175202 20175204 20175216 《信息安全系统设计基础》实验三 并发程序

标签:dsc   stream   get   oid   技术   虚拟   连接   设计   注意   

原文地址:https://www.cnblogs.com/gexvyang/p/11881837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!