zoukankan      html  css  js  c++  java
  • 20175327 第八周课堂测验补交

    20175327 第八周课堂测验补交

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

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

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

    • 在基于socket编程的基础上,以下为服务端代码部分
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<string.h>
    #include<ctype.h>
    #include<arpa/inet.h>
    #include<unistd.h>
    #include<errno.h>
    #include <time.h>
    
    #define SERV_PORT 13327
    
    int std_err(const char* name)
    {
        perror(name);
        exit(1);
    }
    
    int main(void)
    {
        int sfd, cfd, ret;
        int len;
        pid_t pid;
        socklen_t clie_len;
    
        char buf[BUFSIZ], clibuf[32];
    
        //创建服务器套节字
        sfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sfd == -1)
            std_err("socket");
    
        //定义地址类型
        struct sockaddr_in serv_addr, clie_addr;
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(SERV_PORT);
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
        //绑定服务器的IP、端口;
        ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
        if(ret == -1)
            std_err("bind");
    
        //监听链接服务器的客户数量
        ret = listen(sfd, 3);
        if(ret == -1)
            std_err("listen");
        clie_len = sizeof(clie_addr);
    
        while(1)
        {
            //阻塞等待客户端发起链接请求
            cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len);
        printf("服务器实现者20175327	");
        printf("客户端IP:%s
    ",inet_ntoa(clie_addr.sin_addr)); 
        
            time_t t = time(0); 
            char tmp[64]; 
            strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A
    	", localtime(&t) ); 
    
        //这里无需打印当前时间,应该是客户端打印当前时间
            if(cfd == -1)
                std_err("accept");
    
            pid = fork();
    
            if(pid < 0)
                std_err("fork:");
            else if(pid == 0)
            {
                close(sfd);
                break;
            }
            else        //1.回收子进程,2,关闭不必要的文件描述父 3,继续等待客户端链接,如果有,则继续创建子进程
            {
                send(cfd,tmp,strlen(tmp),0);
                close(cfd);
            }
        }
        return 0;
    }
    
    • 在基于socket编程的基础上,以下为客户端代码部分
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<string.h>
    #include<ctype.h>
    #include<arpa/inet.h>
    #include<unistd.h>
    #include<sys/wait.h>
    #include<signal.h>
    #include<errno.h>
    #include<pthread.h>
    
    #define SERV_PORT 13327
    #define SERV_IP "127.0.0.1"
    #define NUM 3
    
    int std_err(const char* name)
    {
        perror(name);
        exit(1);
    }
    
    int main(void)
    {
        int cfd, ret;
        char buf[BUFSIZ];
        pid_t pid;
    
        int i;
        for(i = 0; i < NUM; i++){
            pid = fork();
            if(pid == 0)
                break;
            else if(pid < 0)
                std_err("fork");
        }
    
        //子进程逻辑
        if(pid == 0)
        {
            //创建套节字
            cfd = socket(AF_INET, SOCK_STREAM, 0);
            if(cfd == -1)
                std_err("socket");
    
            //定义IP , 端口
            struct sockaddr_in clie_addr;
            clie_addr.sin_family = AF_INET;
            clie_addr.sin_port = htons(SERV_PORT);
    
            //转换IP 字符串的地址
            ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr);
            if(ret != 1)
                std_err("inet_pton");
    
            //链接服务器
            ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));
            if(ret == -1)
                std_err("connect");
    
        char buff[256];
        int nRecv=recv(cfd,buff,256,0);
        if(nRecv>0)
        {   
            buff[nRecv]='';
            printf("当前时间:%s
    ",buff);
        } 
        }
        //关闭套节字
        close(cfd);
        return 0;
    }
    
    • 实验结果截图:

  • 相关阅读:
    [c language] getopt
    编程经典问题
    一些常用的正则表达式
    [Head First Python]6. summary
    Java多线程
    JVM运行原理
    Struts2---自定义拦截器
    SpringMVC框架初步
    测试基本问题
    自动化测试
  • 原文地址:https://www.cnblogs.com/hollfull/p/11947578.html
Copyright © 2011-2022 走看看