socket测试

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

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

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

代码如下:

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>                                                         
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MAXLINE 200
#define RIO_BUFSIZE 8192

typedef struct{
           int rio_fd;
           int rio_cnt;
           char *rio_bufptr;
           char rio_buf[RIO_BUFSIZE];

}rio_t;

typedef struct sockaddr SA;
typedef struct{
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;
        int tm_wday;
        int tm_yday;
        int tm_isdst;
}tm;

void sigchld_handler(int sig){

            pid_t pid;
            int stat;

            while((pid = waitpid(-1,&stat,WNOHANG))>0){
                printf("child %d terminated\n",pid);
 }
            return;
}

int main(int argc,char **argv){

            int listenfd,connfd,port,clientlen;
            struct sockaddr_in clientaddr;
            struct hostent *hp;
            char *haddrp;
            char sbuf[MAXLINE];
            char rbuf[MAXLINE];
            rio_t rio;
            time_t lt;
            tm *local;
            char str1[MAXLINE]="客户端IP:";
            char str2[MAXLINE]="服务器实现者学号:";
            char str3[MAXLINE]="当地时间:";

    if(argc != 2){

            fprintf(stderr,"usage:%s <port>\n",argv[0]);
            exit(0);
                                                                        }
      port = atoi(argv[1]);
signal(SIGCHLD,sigchld_handler);
    listenfd = open_listenfd(port);
                                                                            while(1){

     clientlen = sizeof(clientaddr);
     connfd = accept(listenfd,(SA *)&clientaddr,&clientlen);
     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)\n",hp->h_name,haddrp);
     if(fork() == 0){
     close(listenfd);
     lt = time(NULL);
     local = localtime(&lt);
     strftime(sbuf,64,"%Y-%m-%d %H:%M:%S",local);
     send(connfd,sbuf,MAXLINE,0);
     close(connfd);
     exit(0);
        }
    close(connfd);

      }
}

#include <stdio.h>
#include <netinet/in.h>                                                         
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>

#define RIO_BUFSIZE 8192

typedef struct{
    int rio_fd;
    int rio_cnt;
    char *rio_bufptr;
    char rio_buf[RIO_BUFSIZE];

}rio_t;

#define MAXLINE 200

int main(int argc,char **argv){
int clientfd,port;
    char *host,buf[MAXLINE];
    char sbuf[MAXLINE];
    char rbuf[MAXLINE];
    rio_t rio;
    char str1[MAXLINE]="客户端IP:";
    char str2[MAXLINE]="学号:20191316";

    char str3[MAXLINE]="当地时间:";

    if(argc!=3){

        fprintf(stderr,"usage:%s <host> <port>\n",argv[0]);
        exit(0);
    }
    host = argv[1];
    port = atoi(argv[2]);

    clientfd = open_clientfd(host,port);
while(1){


        recv(clientfd,rbuf,MAXLINE,0);

        printf("%s",str1);
        puts(host);

        printf("%s",str2);
        putchar('\n');

        printf("%s",str3);

        puts(rbuf);

        close(clientfd);

        exit(0);
    }
}

因为我虚拟机的时间和标准时间不对应,老师可以看我截图下方本机的时间

两个客户端

posted @ 2021-12-20 11:44  20191316王秋雨  阅读(289)  评论(0编辑  收藏  举报