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\t");
    printf("客户端IP:%s\n",inet_ntoa(clie_addr.sin_addr)); 
    
        time_t t = time(0); 
        char tmp[64]; 
        strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A\n\t", 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]='\0';
        printf("当前时间:%s\n",buff);
    } 
    }
    //关闭套节字
    close(cfd);
    return 0;
}
  • 实验结果截图:

posted @ 2019-11-28 11:05  20175327Fkn  阅读(72)  评论(0编辑  收藏  举报