• 实验四 Web服务器2


    实验四 Web服务器2

    ## 信息安全系统设计与实现

    20191318王泽文


    Web服务器的客户端服务器
    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<string.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    #include<sys/wait.h>
     
    int port;
    #define BACKLOG 5
     
    extern int close(int fd);
     
    //http协议text/html类型头
    char *resp_header = "HTTP/1.1 200 OK\r\n"
                        "Content-Type: text/html;charset=UTF-8\r\n"
                        "Server: Wavin Web Server/1.1\r\n";
     
    //头长度
    int resp_header_len;
     
    //模拟html文件
    char *html_body = "<!DOCTYPE html>"
                      "<html><head>"
                      "<title>Welcome to 20191318wzw Web Server (WWS)</title>"
                      "</head><body>Hello by 20191318wzw</body></html>";
     
    int get_socketfd()
    {
        int server_fd;             
        struct sockaddr_in my_addr; 
        resp_header_len = strlen(resp_header);
        server_fd=socket(AF_INET,SOCK_STREAM,0);
        if(server_fd==-1){
            printf("socket failed:%d\n",errno);
            return -1;
        }
        my_addr.sin_family=AF_INET;
        my_addr.sin_port=htons(port);
        my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        bzero(&(my_addr.sin_zero),8);             
        if(bind(server_fd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){
            printf("bind error\n");
            return -1;
        }
        listen(server_fd,BACKLOG);
        return server_fd;
    }
     
    void parse_request(int server_fd)
    {
        int client;
        int len;
        char url[256];
        char buffer[1024];
        struct sockaddr_in client_addr;
        socklen_t length = sizeof(client_addr);
        printf("Start Socket Listening at port:%d...\n",port);
        while(1){
            client=accept(server_fd,(struct sockaddr*)&client_addr,&length);
            if(client < 0){
                printf("open client socket error\n");
                continue;
            }
            memset(buffer,0,sizeof(buffer));
            //接受客户端请求
            len = recv(client,buffer,sizeof(buffer),0);
            buffer[1024] = '\0';
            printf("receive data len : %d \n\nbuffer:\n %s\n",len,buffer);
     
            memset(buffer,0,sizeof(buffer));
            sprintf(buffer,"%s\n%s",resp_header,html_body);
            printf("send data is:\n%s\n",buffer);
            //发送响应到客户端
            if(send(client,buffer,resp_header_len+strlen(html_body),0) <= 0){
                printf("response failed !\n");
                close(client);
                return;
            }
        }
     
    }
     
    int str2int(char *str)
    {
        int result = 0;
        int len,i,j;
        len = strlen(str);
        for ( i=0; i<len; i++){
            if(str[i] >= '0' && str[i] <= '9'){
                int tmp = 1;
                printf("%d\n",str[i] - '0');
                for ( j=0; j<len-i-1; j++){
                    tmp = tmp * 10;
                }
                result += (str[i] - '0') * tmp;
                printf("tmp:%d result:%d\n",tmp,result);
            }
        }
        return result;
    }
     
    int main(int argc, char **argv)
    {
        int server;
        char *args = argv[1];
        
        port = (args == NULL)?8080:str2int(args);
     
        server = get_socketfd();
        parse_request(server);
     
        close(server);
     
        return 0;
    }
    

    运行
    服务端:

    客户端


    码云链接:https://gitee.com/Yushino/system-job/tree/master/socket

  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/wzwyoshino/p/15679282.html
Copyright © 2020-2023  润新知