zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155320第八周课堂实践总结+课下作业

    2017-2018-1 20155320第八周课堂实践总结+课下作业

    第八周测试-1和第八周测试-2课上已经交了

    第八周测试-3

    基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
    服务器响应消息格式是


    客户端IP:XXXX
    服务器实现者学号:XXXXXXXX
    当前时间: XX:XX:XX

    上方提交代码
    提交一个客户端至少查询三次时间的截图测试截图
    提交至少两个客户端查询时间的截图测试截图

    • 在网上找了代码修改后实现,ps:根据学号5320计算得到端口号为333

    出现的问题和解决过程

    • 在编译时出现如下情况

    • 这是由于csapp.c 未被导入导致的,但是之前我已经将cssap.c和csapp.h导入到了include文件夹和lib文件夹下。为了解决这个问题,我将csapp.c已入客户端和服务器的代码所在的文件夹下,在编译时时将csapp.c一起编译就可以了。

    第八周课下作业1

    1 完成家庭作业4.47,4.48,4.49

    2 相应代码反汇编成X86-64汇编

    3 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码

    发操作过程、测试、问题解决过程博客链接

    • 家庭作业4,47

    取指阶段:icode=ifun<--MI[PC]=D:0

    valP<=PC+1;下一条指令地址

    译码阶段:valE<=R[%ebp];得到ebp的值,即新的栈指针esp的值

    执行阶段: valE<=valB+4;栈指针的值+4

    访存阶段:valM<=M4[valB];读ebp中的值

    写回阶段:R[%esp]<=valE;把更新后的指针赋值给esp

    R[%ebp]<=valM;弹出的ebp的值

    • 家庭作业4.48

    取值阶段:icode:ifun=MI[PC]=C:0;

    rA:rB<-[PC+1]

    valC<-M4[PC+2]

    valP<-PC+6

    译码阶段:valB<-R[rB]

    执行阶段:valE<-valB+valC

    SetCC

    访存阶段

    写回阶段 R[r8]<-valE

    第八周课下作业2(课上没完成的必做)

    把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试

    提交博客链接

    client.c (没有变)

    /*
     * echoclient.c - An echo client
     */
    /* $begin echoclientmain */
    #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("服务器实现者学号:20155320
    ");
        
        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);
    }
    /* $end echoclientmain */
    
    

    -多进程实现
    只需要修改server的代码
    server3.c代码:

    #include "csapp.h"
    void echo(int connfd,char *haddrp);
    
    void sigchld_handler(int sig) //line:conc:echoserverp:handlerstart
    {
        while (waitpid(-1, 0, WNOHANG) > 0)
    	;
        return;
    } //line:conc:echoserverp:handlerend
    
    int main(int argc, char **argv) 
    {
        int listenfd, connfd, port;
        char *haddrp;
        socklen_t clientlen=sizeof(struct sockaddr_in);
        struct sockaddr_in clientaddr;
    
        if (argc != 2) {
    	fprintf(stderr, "usage: %s <port>
    ", argv[0]);
    	exit(0);
        }
        port = atoi(argv[1]);
    
        Signal(SIGCHLD, sigchld_handler);
        listenfd = Open_listenfd(port);
        while (1) {
    	connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen);
    	if (Fork() == 0) { 
    	    haddrp = inet_ntoa(clientaddr.sin_addr);
    	    Close(listenfd); /* Child closes its listening socket */
    	    echo(connfd,haddrp);    /* Child services client */ //line:conc:echoserverp:echofun
    	    Close(connfd);   /* Child closes connection with client */ //line:conc:echoserverp:childclose
    	    exit(0);         /* Child exits */
    	}
    	Close(connfd); /* Parent closes connected socket (important!) */ //line:conc:echoserverp:parentclose
        }
    }
    
    
    • 截图

    • 多线程实现

    server2.c代码:

    
    #include "csapp.h"
    
    void *thread(void *vargp);
    
    void echo(int connfd,char *haddrp);
    
    char *haddrp;
    
    int main(int argc, char **argv) 
    
    {
    
        int listenfd, *connfdp, port, clientlen=sizeof(struct sockaddr_in);
    
    	struct sockaddr_in clientaddr;
    
        pthread_t tid; 
    
    
    
        if (argc != 2) {
    
        fprintf(stderr, "usage: %s <port>
    ", argv[0]);
    
        exit(0);
    
        }
    
        port = atoi(argv[1]);
    
    
    
        listenfd = Open_listenfd(port);
    
        while (1) {
    
        connfdp = Malloc(sizeof(int));
    
        haddrp = inet_ntoa(clientaddr.sin_addr);
    
    	*connfdp = Accept(listenfd, (SA *) &clientaddr, &clientlen);
    
        Pthread_create(&tid, NULL, thread, connfdp);
    
        }
    
    }
    
    
    
    /* thread routine */
    
    void *thread(void *vargp) 
    
    {  
    
        int connfd = *((int *)vargp);
    
        Pthread_detach(pthread_self()); 
    
        Free(vargp);
    
        echo(connfd,haddrp);
    
        Close(connfd);
    
        return NULL;
    
    }
    
    
    • 两个客户端的连接截图:

    运行期间遇到的问题:

    问题:在做多线程和多进程时发现出现提示Address already be used 的提示,经过查询,发现是由于端口被占用。

    解决:在网上查到了教程,解决了问题,截图在前文

    1.查找被占用的端口
    netstat -tln
    netstat -tln | grep 8080
    netstat -tln 查看端口使用情况,而netstat -tln | grep 8080则是只查看端口8080的使用情况

    2.查看端口属于哪个程序?端口被哪个进程占用
    lsof -i:8060
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    Java 20804 root 36u IPv6 35452317 0t0 TCP *:pcsync-https (LISTEN)

    3.杀掉占用端口的进程 根据pid杀掉
    kill -9 进程id
    kill -9 20804

  • 相关阅读:
    new JSONObject()报空指针异常
    转:修改Fckeditor 2.6 增加插入Mp3等多媒体文件功能
    执行更新操作时,timestamp类型的字段自动被更新为了系统当前日期
    读取某个文件的位置
    myeclipse配置注释
    为eclipse 的 hibernate 配置文件加提示
    hibernate3与hibernate4
    查看eclipse版本
    Eclipse编译没有class文件生成
    严重: Error loading WebappClassLoader context:
  • 原文地址:https://www.cnblogs.com/ljq1997/p/7821988.html
Copyright © 2011-2022 走看看