zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155332实验三 实时系统报告

    20155332 实验三

    任务一:

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

    客户端

    #include<netinet/in.h> 
    #include<sys/types.h>  
    #include<sys/socket.h> 
    #include<stdio.h>   
    #include<stdlib.h>   
    #include<string.h>   
    #define SERVER_PORT 5201
    #define LENGTH_OF_LISTEN_QUEUE 20
    #define BUFFER_SIZE 1024
    #define FILE_NAME_MAX_SIZE 512
    #define MAX 10000000
    
    int main(void)
    {
      // 声明并初始化一个服务器端的socket地址结构
      struct sockaddr_in server_addr;
      bzero(&server_addr, sizeof(server_addr));
      server_addr.sin_family = AF_INET;
      server_addr.sin_addr.s_addr = htons(INADDR_ANY);
      server_addr.sin_port = htons(SERVER_PORT);
      
      // 创建socket,若成功,返回socket描述符
      int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
      if(server_socket_fd < 0)
          {
                perror("Create Socket Failed:");
                exit(1);
              }
      int opt = 1;
      setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
      
      // 绑定socket和socket地址结构
      if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
          {
                perror("Server Bind Failed:");
                exit(1);
              }
        
      // socket监听
      if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
          {
                perror("Server Listen Failed:");
                exit(1);
              }
      
      while(1)
          {
                // 定义客户端的socket地址结构
                struct sockaddr_in client_addr;
                socklen_t client_addr_length = sizeof(client_addr);
              
                // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信
                // accept函数会把连接到的客户端信息写到client_addr中
                int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
                if(new_server_socket_fd < 0)
                    {
                          perror("Server Accept Failed:");
                          break;
                        }
              
                // recv函数接收数据到缓冲区buffer中
                char buffer[BUFFER_SIZE];
                bzero(buffer, BUFFER_SIZE);
                if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)
                    {
                          perror("Server Recieve Data Failed:");
                          break;
                        }
              
                // 然后从buffer(缓冲区)拷贝到file_name中
                char file_name[FILE_NAME_MAX_SIZE+1];
                bzero(file_name, FILE_NAME_MAX_SIZE+1);
                strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
                printf("%s
    ", file_name);
              
                // 打开文件并读取文件数据
                FILE *fp = fopen(file_name, "r");
                if(NULL == fp)
                    {
                          printf("File:%s Not Found
    ", file_name);
                        } 
                else
                    {
                    printf("buffer:%s
    ",buffer);//buffer为filename
                    
                    char *argv[]={"wc","-w",file_name,0};
                    execvp( "wc" ,argv);
                    
                           
                          fclose(fp); 
                          
                        } 
                // 关闭与客户端的连接 
                close(new_server_socket_fd); 
              } 
      // 关闭监听用的socket 
      close(server_socket_fd); 
      return 0; 
    }
    

    服务器

    	#include<netinet/in.h> // sockaddr_in
    	#include<sys/types.h>  // socket
    	#include<sys/socket.h> // socket
    	#include<stdio.h>    // printf
    	#include<stdlib.h>   // exit
    	#include<string.h>   // bzero
    
    	#define SERVER_PORT 8000
    	#define LENGTH_OF_LISTEN_QUEUE 20
    	#define BUFFER_SIZE 1024
    	#define FILE_NAME_MAX_SIZE 512
    
    void itoa(int i,char* string)
    {
        int power,j;
        j=i;
        for(power=1;j>=10;j/=10)
            power*=10;
        for(;power>0;power/=10)
        {
            *string++='0'+i/power;
            i%=power;
        }
        *string='';
    }
    
    int main(void)
    {
      // 声明并初始化一个服务器端的socket地址结构
      struct sockaddr_in server_addr;
      bzero(&server_addr, sizeof(server_addr));
      server_addr.sin_family = AF_INET;
      server_addr.sin_addr.s_addr = htons(INADDR_ANY);
      server_addr.sin_port = htons(SERVER_PORT);
    
      // 创建socket,若成功,返回socket描述符
      int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
      if(server_socket_fd < 0)
      {
        perror("Create Socket Failed:");
        exit(1);
      }
      int opt = 1;
      setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    
      // 绑定socket和socket地址结构
      if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
      {
        perror("Server Bind Failed:");
        exit(1);
      }
    
      // socket监听
      if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
      {
        perror("Server Listen Failed:");
        exit(1);
      }
    
      while(1)
      {
        // 定义客户端的socket地址结构
        struct sockaddr_in client_addr;
        socklen_t client_addr_length = sizeof(client_addr);
    
        // 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信
        // accept函数会把连接到的客户端信息写到client_addr中
        int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
        if(new_server_socket_fd < 0)
        {
          perror("Server Accept Failed:");
          break;
        }
    
        // recv函数接收数据到缓冲区buffer中
        char buffer[BUFFER_SIZE];
        bzero(buffer, BUFFER_SIZE);
        if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0)
        {
          perror("Server Recieve Data Failed:");
          break;
        }
    
        // 然后从buffer(缓冲区)拷贝到file_name中
        char file_name[FILE_NAME_MAX_SIZE+1];
        bzero(file_name, FILE_NAME_MAX_SIZE+1);
        strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
        printf("%s
    ", file_name);
    
        // 打开文件并读取文件数据
        FILE *fp = fopen(file_name, "w");
        if(NULL == fp)
        {
          printf("File:%s Not Found
    ", file_name);
        }
        else
        {
          bzero(buffer, BUFFER_SIZE);
          int length = 0;
          // 每读取一段数据,便将其发送给客户端,循环直到文件读完为止
          char*ch="bye";
        while((length = recv(new_server_socket_fd, buffer, 1024, 0)) > 0)
        {
        if(strcmp(buffer,ch)==0)break;
        if(fwrite(buffer, sizeof(char), length, fp) < length)
        {
          printf("File:	%s Write Failed
    ", file_name);
          break;
        }
        bzero(buffer, BUFFER_SIZE);
        }fclose(fp);
        int count=0;
        char s[21];
        FILE *fp1;
        if((fp1=fopen(file_name,"r"))==NULL){
            printf("Open the file failure...
    ");
            exit(0);
        }
        while(fscanf(fp,"%s",s)!=EOF)
            count++;
        fclose(fp1);
        itoa(count,buffer);
        printf("There is(are) %s word(s) in the text.
    ",buffer);
          // 关闭文件
    
          send(new_server_socket_fd, buffer, strlen(buffer), 0);
          printf("File:%s Transfer Successful!
    ", file_name);
        }
        // 关闭与客户端的连接
        close(new_server_socket_fd);
        }
        // 关闭监听用的socket
        close(server_socket_fd);
        return 0;
        }
    

    任务二

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

    #include <sys/time.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    #define BACKLOG 1
    #define MAXRECVLEN 10240
    
    int main(int argc, char *argv[])
    {
        char buf[MAXRECVLEN];
        int listenfd, connectfd;  
        int port;
        struct sockaddr_in server; 
        struct sockaddr_in client; 
        socklen_t addrlen;
        if (argc != 2) {
        fprintf(stderr, "usage: %s <port>
    ", argv[0]);
        exit(0);
        }
        port = atoi(argv[1]);
        
        if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
            
            perror("socket() error. Failed to initiate a socket");
            exit(1);
        }
     
        
        int opt = SO_REUSEADDR;
        setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    
        bzero(&server, sizeof(server));
    
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        server.sin_addr.s_addr = htonl(INADDR_ANY);
        if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)
        {
            /* handle exception */
            perror("Bind() error.");
            exit(1);
        }
        
        if(listen(listenfd, BACKLOG) == -1)
        {
            perror("listen() error. 
    ");
            exit(1);
        }
    
        addrlen = sizeof(client);
        while(1){
            if((connectfd=accept(listenfd,(struct sockaddr *)&client, &addrlen))==-1)
              {
                perror("accept() error. 
    ");
                exit(1);
              }
            FILE *stream;
            struct timeval tv;
            gettimeofday(&tv, NULL);
              printf("You got a connection from client's ip %s, port %d ",inet_ntoa(client.sin_addr),port);
            
            int iret=-1;
            char d[10240];
             iret = recv(connectfd, buf, MAXRECVLEN, 0);
                if(iret>0)
                {
                   strcpy(d,buf);
                    stream = fopen(buf,"r");
                    bzero(buf, sizeof(buf));
                    strcat(buf,"单词数:");
                    char s[21];
    long int count = 0;
                    while(fscanf(stream,"%s",s)!=EOF)
                    count++;
                    char str[10];
    sprintf(str, "%ld", count); 
    int n = sizeof(str);
    str[n] = ''; 
    strcat(buf,str);
    strcat(buf,"
    ");
                    
                }else
                {
                    close(connectfd);
                    break;
                }
                
                send(connectfd, buf, iret, 0); 
        
        close(listenfd); 
        return 0;
    }
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h> 
    #define MAXDATASIZE 100
    
    int main(int argc, char *argv[])
    {
        int sockfd, num;    
        int port;
        char buf[MAXDATASIZE];   
        struct hostent *he;    
        
        if (argc != 4)
        {
            printf("Usage: %s <PORT><IP Address><Filename>
    ",argv[0]);
            exit(1);
        }
        port = atoi(argv[1]);
        if((he=gethostbyname(argv[2]))==NULL)
        {
            printf("gethostbyname() error
    ");
            exit(1);
        }
        
        if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1)
        {
            printf("socket() error
    ");
            exit(1);
        }
        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        server.sin_addr = *((struct in_addr *)he->h_addr);
        if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
        {
            printf("connect() error
    ");
            exit(1);
        }
    char str[MAXDATASIZE] ;
    strcpy(str,argv[3]);
    
    if((num=send(sockfd,str,sizeof(str),0))==-1){
          printf("send() error
    ");
            exit(1);
        }
        if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
        {
            printf("recv() error
    ");
            exit(1);
        }
        buf[num-1]='';
        printf("%s",buf);
    
        close(sockfd);
        return 0;
    }
    
  • 相关阅读:
    Python 爬虫-正则表达式
    Python 爬虫-信息的标记xml,json,yaml
    Python 爬虫-BeautifulSoup
    bzoj 1491
    bzoj 1406 数论
    Codeforces Round #496 (Div. 3) E2
    2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) 日常训练
    Codeforces Round #496 (Div. 3) F
    bzoj 1415 期望dp + 记忆化搜索
    bzoj 1483 链表 + 启发式合并
  • 原文地址:https://www.cnblogs.com/besti2015/p/7862921.html
Copyright © 2011-2022 走看看