• 2018-2019-1 20165322 第八周课上测试补做


    第八周课上测试补做

    题目二

    • 把第一个练习中的代码在X86-64(Ubuntu)中反汇编,给出汇编代码和机器码的截图
    • 把X86-64汇编翻译成Y86-64汇编,并给出相应机器码的截图(使用附件中的Y86-64模拟器)

    过程:

    • 终端输入gcc -E test1.c -o test1.i
    • 终端输入gcc -S test.1.i -o main.s
    • cat test1.s查看汇编代码,objdump -d test1命令查看机器码

    • 安装词法分析工具:sudo apt-get install bison flex

    • 安装Tcl/Tk支持图形界面:sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

    • 解压sim包后打开修改Makefile文件:

      • GUIMODE=-DHAS_GUI(去掉#)
      • TKLIBS=-L/usr/lib -ltk8.5 -ltcl8.5
      • TKINC=-I/usr/include/tcl8.5
    • 在sim路径下终端输入:

      • make clean
      • make
        即可将sim包中的.ys文件全部转换为.yo文件
    • 在pipe路径下终端输入./psim -t -g ../y86-code/asum.yo跳出Y86-64模拟器,测试成功

    • 由于不会编写第一题的X86-64代码……没有得到想要的.ys文件……弃疗……

    出现的问题及解决方法

    • make时,出现了对'matherr'未定义引用的错误

    • 解决:

      • 根据报错信息,进入pipe目录将psim.c文件中包含'matherr'的两行代码注释掉
      • 进入seq目录将ssim.c文件中包含'matherr'的两行代码注释掉
      • 再次make clean、make后成功

    题目三

    • 基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
    • 服务器响应消息格式是
    客户端IP:XXXX
    服务器实现者学号:XXXXXXXX
    当前时间: XX:XX:XX
    

    过程

    代码:

    • echo.c
    #include "csapp.h"
    
    #include <time.h>
    
    
    
    void echo(int connfd, char *haddrp)
    
    {
    
        time_t t;
    
        struct tm * lt;
    
        size_t n; 
    
        char buf[MAXLINE]; 
    
        rio_t rio;
    
    
    
        Rio_readinitb(&rio, connfd);
    
        while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) { //line:netp:echo:eof
    
        //printf("server received %d bytes
    ", n);
    
        printf("
    客户端IP:%s
    ",haddrp);
    
        printf("服务器实现者学号:20165322
    ");
    
        
    
        time (&t);//获取Unix时间戳
    
        lt = localtime (&t);//转为时间结构
    
        printf ("当前时间为:%d/%d/%d %d:%d:%d
    ",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。注意月份取值区间为[0,11],所以要+1;年份的修改。
    
        
    
    	
    
    	Rio_writen(connfd, buf, n);
    
        }
    
    }
    
    
    
    • server.c
    #include "csapp.h"
    
    
    
    void echo(int connfd, char *haddrp);
    
    
    
    int main(int argc, char **argv) 
    
    {
    
        int listenfd, connfd, port, clientlen;
    
        struct sockaddr_in clientaddr;
    
        struct hostent *hp;
    
        char *haddrp;
    
        if (argc != 2) {
    
    	fprintf(stderr, "usage: %s <port>
    ", argv[0]);
    
    	exit(0);
    
        }
    
        port = atoi(argv[1]);
    
    
    
        listenfd = Open_listenfd(port);
    
        while (1) {
    
    	clientlen = sizeof(clientaddr);
    
    	connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
    
    
    
    	/* determine the domain name and IP address of the client */
    
    	hp = Gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, 
    
    			   sizeof(clientaddr.sin_addr.s_addr), AF_INET);
    
    	haddrp = inet_ntoa(clientaddr.sin_addr);
    
    	printf("server connected to %s (%s)
    ", hp->h_name, haddrp);
    
    
    
    	echo(connfd, haddrp);
    
    	Close(connfd);
    
        }
    
        exit(0);
    
    }
    
    
    
    • client.c
    #include "csapp.h"
    
    
    
    int main(int argc, char **argv) 
    
    {
    
        int clientfd, port;
    
        char *host, buf[MAXLINE];
    
        rio_t rio;
    
    
    
        if (argc != 3) {
    
    	fprintf(stderr, "usage: %s <host> <port>
    ", argv[0]);
    
    	exit(0);
    
        }
    
        host = argv[1];
    
        port = atoi(argv[2]);
    
    
    
        clientfd = Open_clientfd(host, port);
    
        Rio_readinitb(&rio, clientfd);
    
    
    
        while (Fgets(buf, MAXLINE, stdin) != NULL) {
    
    	
    
    	time_t t;
    
        struct tm * lt;
    
        size_t n; 
    
        printf("
    客户端IP:127.0.0.1
    ");
    
        printf("服务器实现者学号:20165322
    ");
    
        
    
        time (&t);//获取Unix时间戳
    
        lt = localtime (&t);//转为时间结构
    
        printf ("当前时间为:%d/%d/%d %d:%d:%d
    ",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。注意月份取值区间为[0,11],所以要+1;年份的修改。
    
    	Rio_writen(clientfd, buf, strlen(buf));
    
    	Rio_readlineb(&rio, buf, MAXLINE);
    
    	Fputs(buf, stdout);
    
        }
    
        Close(clientfd); //line:netp:echoclient:close
    
        exit(0);
    
    }
    
    
    
    • 注意编译时要将echo.c csapp.c 和client.c一起编译
    • 同样server.c 也要与另外两个代码一起编译

    实验结果截图

  • 相关阅读:
    分享:一个支持并发, 支持异步/同步, 支持http/https, 支持续传的avhttp库
    EvaThumber : 基于URL的图片处理库 (可实现缩略图 | 二维码 | 水印 | 面部识别等)
    Stanford University Introduction to Computational Advertising
    saghul, on code « How do event loops work in Python?
    django orm 自己跟自己一对多关系? django问答求助 python官方论坛 Powered by Discuz!
    台北印象 阮一峰的网络日志
    Connector/ODBC 64 bit windows version
    The Django Book
    使用 libevent 和 libev 提高网络应用性能
    SNA Shared Nothing Architecture
  • 原文地址:https://www.cnblogs.com/wangyaojia/p/10047597.html
Copyright © 2020-2023  润新知