《Linux网络开发必学教程》29_动态创建交互页面

码界逐光人
• 阅读 1095
问题:如何创建浏览器中的文件展示页面?

再论前端页面

《Linux网络开发必学教程》29_动态创建交互页面

交互页面分析

  • 静态部分

    • 表格,页面结构
  • 动态部分

    • 文件浏览路径 (Path)
    • 文件列表(Table)
"<!DOCTYPE html>"
"<html>"
"    <head>"
"    <meta charset=\"utf-8\">"
"    <title>D.T.Software</title>"
"    <head>"
"    <body>"
"    <h1>DT4SW Http File Server</h1>"
"    <hr/>"
"    <h3>Path: %s</h3>"
"    %s"
"    <body>"
"<html>"

文件列表分析

  • 静态

    • 表格标题行
    • 表格列表结构
  • 动态部分

    • 表格行数据
"<table border=\"1\" width=\"100%\">";
"    <tr>"
"        <th>File Name</th><th>File Type</th><th>File Size</th><th>Modify Time</th>"
"    </tr>"
"        <td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td><td>%s</td>"
"    </tr>"
"</table>"

文件列表接口函数及数据结构

  • Table *CreateTable();
  • Table *InsertRow(Table *table, RowInfo *info);
  • char *ToTableString(Table *table);
  • void FreeTable(Table *table);
typedef void Table;
typedef struct {
    char link[2048];
    char name[255];
    char type[32];
    char size[32];
    char time[32];
}RowInfo;

解决方案

  • CreateTable()

    • 从堆空间创建表格标题行,并作为初始表格数据返回
  • InsertRow(table, info)

    • 将 info 中的字符串进行表格行格式化,并添加到 table 末尾
  • ToTableString(table)

    • 将 table 表格数据格式化为 HTML 字符串,并返回

表格动态创建关键代码

if (table && info) {
    char *t = table;
    int len = strlen(t);
    char *buf = malloc(strlen(ROW_FORMAT) + sizeof(*info));
    if (buf) {
        sprintf(buf, ROW_FORMAT, info->link, info->name, info->type, info->size, info->time);
        ret = realloc(t, len + strlen(buf) + 1);
        ret = ret ? (strcpy(ret + len, buf), ret) : t;
    } else {
        ret = t;
    }
    free(buf);
}

页面动态创建代码

char *ToPageString(const char *path, char *ts)
{
    char *ret = NULL;

    if (path && ts && (ret = malloc(strlen(PAGE_FORMAT) + strlen(path) + strlen(ts) + 1))) {
        sprintf(ret, PAGE_FORMAT, path, ts);
    }

    return ret;
}

编程实验:动态创建交互页面

main.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>

#include "tcp_server.h"
#include "tcp_client.h" 
#include "utility.h"
#include "page.h"

int main(int argc, char *argv[])
{
    Table *t = CreateTable();
    RowInfo ri = {"aa", "bbb", "cccc", "ddddd", "eeeeee"};
    RowInfo rj = {"11", "222", "3333", "44444", "555555"};

    t = InsertRow(t, &ri);
    t = InsertRow(t, &rj);

    char *ts = ToTableString(t);
    char *page = ToPageString("test/path/folder", ts);

    printf("%s\n", page);

    free(page);
    free(ts);
    FreeTable(t);

    return 0;
}

page.h

#ifndef PAGE_H
#define PAGE_H

typedef void Table;

typedef struct
{
    char link[2048];
    char name[255];
    char type[32];
    char size[32];
    char time[32];
} RowInfo;

char* ToPageString(const char* path, const char* ts);
Table* CreateTable();
Table* InsertRow(Table* table, RowInfo* info);
char* ToTableString(Table* table);
void FreeTable(Table* table);

#endif  // PAGE_H

page.c

#include "page.h"

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

static const char* PAGE_FORMAT = "<!DOCTYPE html>"
                                 "<html>"
                                 "  <head>"
                                 "    <meta charset=\"utf-8\">"
                                 "    <title>D.T.Software</title>"
                                 "  </head>"
                                 "  <body>"
                                 "    <h1>DT4SW Http File Server</h1>"
                                 "    <hr/>"
                                 "    <h3>Path: %s</h3>"
                                 "    %s"
                                 "  </body>"
                                 "</html>";

static const char* TABLE_BEGIN = "<table border=\"1\" width=\"100%\">";
                                                                  
static const char* TABLE_TITLE = "  <tr>"
                                 "    <th>File Name</th><th>File Type</th><th>File Size</th><th>Modify Time</th>"
                                 "  </tr>";
                                
static const char* ROW_FORMAT =  "<tr>"
                                 "  <td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td><td>%s</td>"
                                 "</tr>";     
                                
static const char* TABLE_END =   "  </tr>"
                                 "</table>";  

char *ToPageString(const char *path, const char *ts)
{
    char *ret = NULL;

    if (path && ts && (ret = malloc(strlen(PAGE_FORMAT) + strlen(path) + strlen(ts) + 1))) {
        sprintf(ret, PAGE_FORMAT, path, ts);
    }

    return ret;
}

Table *CreateTable()
{
    const int TITLE_LEN = strlen(TABLE_TITLE);
    char *ret = malloc(TITLE_LEN + 1);

    if (ret) {
        strcpy(ret, TABLE_TITLE);
    }

    return ret;
}

char *ToTableString(Table *table)
{
    const int BEGIN_LEN = strlen(TABLE_BEGIN);
    const int END_LEN = strlen(TABLE_END);
    char *ret = NULL;

    if (table && (ret = malloc(strlen(table) + BEGIN_LEN + END_LEN + 1))) {
        strcpy(ret, TABLE_BEGIN);
        strcpy(ret + BEGIN_LEN, table);
        strcpy(ret  + BEGIN_LEN + strlen(table), TABLE_END);
    }

    return ret;
}

Table *InsertRow(Table *table, RowInfo *info)
{
    char *ret = NULL;

    if (table && info) {
        char *t = table;
        int len = strlen(t);
        char *buf = malloc(strlen(ROW_FORMAT) + sizeof(*info));
        if (buf) {
            sprintf(buf, ROW_FORMAT, info->link, info->name, info->type, info->size, info->time);
            ret = realloc(t, len + strlen(buf) + 1);
            ret = ret ? (strcpy(ret + len, buf), ret) : t;
        } else {
            ret = t;
        }
        free(buf);
    }

    return ret;
}

void FreeTable(Table *table)
{
    free(table);
}
输出
<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title>D.T.Software</title>  </head>  <body>    <h1>DT4SW Http File Server</h1>    <hr/>    <h3>Path: test/path/folder</h3>    <table border="1" width="100%">  <tr>    <th>File Name</th><th>File Type</th><th>File Size</th><th>Modify Time</th>  </tr><tr>  <td><a href="aa">bbb</a></td><td>cccc</td><td>ddddd</td><td>eeeeee</td></tr><tr>  <td><a href="11">222</a></td><td>3333</td><td>44444</td><td>555555</td></tr>  </tr></table>  </body></html>

《Linux网络开发必学教程》29_动态创建交互页面

思考

浏览器于文件服务器如何交互?
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
码界逐光人
码界逐光人
Lv1
好雨知时节,当春乃发生。随风潜入夜,润物细无声。
文章
5
粉丝
0
获赞
0