• Web服务器1socket编程


    基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用Linux Socket实现:

    1. time服务器的客户端服务器,提交程序运行截图

    查看IP地址

    代码如下:

    //timeclient.c
    #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);
        }
    }
    
    
    //timeserver.c
    #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);
    	     }																        }
    }
    
    

    2. echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid 你的学号 姓名 echo :”返回给客户端

    可见客户端输入的内容被服务器又返回给客户端了

    代码如下

    \\echoclient.c
    #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]="服务器进程pid:";
        char str2[MAXLINE]="学号姓名:20191316 王秋雨";
        
        char str3[MAXLINE]="echo:";
    
        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){
            scanf("%[^\n]",sbuf);
            send(clientfd,sbuf,MAXLINE,0);
    
            recv(clientfd,rbuf,MAXLINE,0);
    
            printf("%s",str1);
            printf("%d\n",getpid());
    
            printf("%s",str2);
            putchar('\n');
    
            printf("%s",str3);
    
            puts(rbuf);
           
            close(clientfd);
           
            exit(0);
        }
    
    }
    
    
    //echoserver.c
    #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>
    #include <pthread.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 *thread(void *vargp);
    
    int main(int argc,char **argv){
    
        int listenfd,*connfdp,port;
        int clientlen;
        struct sockaddr_in clientaddr;
        struct hostent *hp;
        char *haddrp;
        pthread_t tid;
    
        if(argc != 2){
        
            fprintf(stderr,"usage:%s <port>\n",argv[0]);
            exit(0);
        }
    
        port = atoi(argv[1]);
    
        listenfd = open_listenfd(port);
        
        
        while(1){
        
            clientlen = sizeof(clientaddr);
    
            connfdp =malloc(sizeof(int));
        
            *connfdp = 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);
    
            pthread_create(&tid,NULL,thread,connfdp);
    
            pthread_join(tid,NULL);
        }
    }
    
    
    void *thread(void *vargp){
        
        time_t lt;
        tm *local;
        char sbuf[MAXLINE];
        char rbuf[MAXLINE];
        int connfd = *((int*)vargp);
    
        free(vargp);
    
        pthread_detach(pthread_self());
    
        recv(connfd,rbuf,MAXLINE,0);
        printf("The massage is :%s\n",rbuf);
        send(connfd,rbuf,MAXLINE,0);
    
        close(connfd);
        
        return NULL;
    }
    
    

    全部代码如下:https://gitee.com/qiu_yu_wang/code/tree/master/socket

    3. 服务器部署到华为云服务器,客户端用Ubuntu虚拟机。

    由于华为云余额不足,我选择了两个虚拟机来操作

    查看虚拟机的IP地址为:192.168.78.128

  • 相关阅读:
    iOS开发 贝塞尔曲线UIBezierPath
    iOS开发 解决使用AVAudioRecorder录制后转mp3解决音量小的问题
    比JDK高效的array equals
    高性能web架构原则
    基于内存映射的千万级数据处理框架
    LesenRPC-基于netty/protobuffer的高性能RPC框架
    java垃圾回收机制详解
    MVC架构详解
    用抽象实现代码解耦
    python按年份统计文件数量
  • 原文地址:https://www.cnblogs.com/ffffatal/p/15633207.html
Copyright © 2020-2023  润新知