在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5927|回复: 12

试试几个练习题

[复制链接]
发表于 2013-3-1 23:42:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
rt...

桌面.rar

5.77 KB, 下载次数: 30 , 下载积分: 资产 -2 信元, 下载支出 2 信元

 楼主| 发表于 2013-3-3 23:03:51 | 显示全部楼层
[url][/url]

熟悉.zip

164.8 KB, 下载次数: 6 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2013-3-12 01:07:21 | 显示全部楼层
什么来的啊。。。
发表于 2013-3-20 15:01:24 | 显示全部楼层
Mark, 慢慢研究,谢谢楼主!

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
 楼主| 发表于 2013-3-20 17:35:53 | 显示全部楼层
本帖最后由 goodlook 于 2013-4-3 17:29 编辑

id范围1—4095,默认所有的端口都为VLAN 1
“2,4-10,15”
返回id范围,格式如上,需要自己组装id范围。
void VLAN_TableInit(void)
{
    return;
}
void VLAN_TableUninit(void)
{
    return;
}
/*****************************************************************************
Description  : 设置端口的允许转发到VLAN范围。
Input Param  : port:   端口,范围0~7;
            permitVlan:     字符串长度0~63,格式参考规则2。
Output       : 无
Return Value :
*****************************************************************************/
int VLAN_TableSet(const unsigned char port,  const char * permitVlan)
{
    char *end = NULL;
int vlanID = 0;
int consecutiveFlag = FALSE;
int startID = 0;
char *pvlanstring = NULL;
char szVlan[MAX_NUM_PERMINT_VLAN] = {0};
if (OK != checkPortID(port)
  || OK != checkInputValid(permitVlan))
{
  printf("input param error...\n");
  return RT_FAILED;
}

strcpy(szVlan, permitVlan);
pvlanstring = szVlan;
do
{
  vlanID = strtol(pvlanstring, &end, 0);
  printf("\nline %d: %d\n", __LINE__, vlanID);
  printf("line %d: %c\n", __LINE__, *end);
  if (OK != checkVlanID(vlanID))
  {
   return RT_FAILED;
  }
  /* process */
  setPort2Vlan(port, startID, vlanID);
  startID = ('-' == *end) ? vlanID : 0;
} while (*end != _D_END_SYMBOL && (pvlanstring = ++end));
return RT_SUCCESS;
}

/*****************************************************************************
Description  : 查询某个VLAN,允许转发该VLAN到端口列表。
Input Param  : vlanID:  要查询的VLAN ID。
Output       : Port [ ]:允许转发输入VLAN ID的端口数组,数组空间由调用者负责分配和释放。
Return Value :
*****************************************************************************/
int VLAN_QueryPort(const unsigned short vlanID, unsigned char Port[])
{
return RT_NOT_IMPLEMENTED;
}
/*****************************************************************************
Description  : 查询某个某个端口允许转发的VLAN范围。
Input Param  : port:  要查询的端口。
Output       : permitVlan:允许转发的VLAN范围,字符串空间由调用者负责分配和释放。格式参考上
Return Value :
*****************************************************************************/
int VLAN_QueryVlan(const unsigned char port, char * permitVlan)
{
    /* 在这里实现功能 */
return RT_NOT_IMPLEMENTED;
}
 楼主| 发表于 2013-4-3 17:27:02 | 显示全部楼层
/*
系统根据用户号码和要访问的URL做访问控制,实现对策略的缓存和查询

  1 控制策略包括允许访问和拒绝房屋内两类
  2 策略设有1,2,3优先级,越大优先级越高
  3 一个号码访问某个URL可以设置N个规则,如果多条规则冲突,则优先采用优先级最高的策略。
        如果相同优先级仍有冲突,则拒绝访问>允许访问。如果没有匹配到任何规则,默认为拒绝访问
  4 设置策略时,用户号码支持前缀形式,比如136123表示从136123000到136123999范围内的
        所有号码。查询策略时,用户号码必须是9位数字(首位不为0)
  5 设置策略和查询策略时,URL支持http://略写,比如www.sina.com
  6 设置策略时,URL支持*模糊匹配。假设策略1为http://*.sina.com,则查询mail.sina.com的权限
     时候,策略1这条规则也生效。
*/

typedef enum tagPolicy
{
        SS_ACCD_URL_REJECT,
        SS_ACCD_URL_ACCEPT,
}POLICY;

void ACCD_Init(void)
{
        return;
}

void ACCD_Uninit(void)
{
        return;
}

/*
接口三:添加用户号码访问URL策略信息函数接口
        允许添加2条完全相同的策略信息
        调用者注入策略信息记录不超过20条
输入:iTelNoPrefix 用户号码或者号码前缀,9位以下正整数
                        pszUrl 不超过127字节的字符串,不能为空指针,也不为空串
                        iPolicy 访问控制策略,数据结构类型POLICY
                        iPriority为1,2,3
*/
int ACCD_InsertPolicy(unsigned int iTelNoPrefix, char *pszUrl, int iPolicy, int iPriority)
{
        return 0;
}

/*
接口四:根据给定的号码和要访问的URL查询访问策略
输入:iTelNO 用户号码,必须为9位数字(首位不为0)
                        pszUrl         不超过127字节的字符串,不能为空指针,也不为空串
                                                 不测试大小写完全匹配问题
输出:piPolicy 欲查询访问策略(根据号码,URL,策略,优先级),空间由调用者保证
*/
intACCD_QueryPolicy(unsigned int iTelNO, char *pszUrl, int *piPolicy)
{
        return 0;
}

int main(void)
{
        return 0;
}
 楼主| 发表于 2013-4-3 17:30:43 | 显示全部楼层
#define MAX_NUM_PORT                8
#define        MAX_NUM_VLANID                4096
#define        MAX_NUM_PERMINT_VLAN        64

/** 接口函数返回码 */
typedef enum _enReturnCode_
{
    RT_SUCCESS         = 0,   /* 动作执行成功*/
    RT_FAILED          = -1,  /* 参数异常、动作和状态不匹配等失败情况*/
    RT_NOT_IMPLEMENTED = -2   /* 不选此题 */
};

/** VLAN 使用状态 */
typedef enum _enVLAN_
{
        VLAN_FORBID        = 0,   /* 禁止转发 */
        VLAN_FORWORD       = 1    /* 允许转发 */
};

int g_vlanID[MAX_NUM_PORT] = {0};
int g_port[MAX_NUM_PORT][MAX_NUM_VLANID] = {0};

int checkInputValid(const_char *pin)
{
        if (NULL == pin)
        {
                return NOK;
        }
       
        if (strlen(pin) > 63)
        {
                return NOK;
        }
       
        return OK;
}

int checkVlanID(int vlanID)
{
        if (vlanID > 4095 || vlanID < 1)
        {
                return NOK;
        }

        return OK;
}

int checkPortID(unsigned char port)
{
        if (port > 7)
        {
                return NOK;
        }

        return OK;
}

int setPort2Vlan(unsigned char port, int startID, int endID)
{
        int i = 0;

        if (endID < startID)
        {
                printf("end SMALLER than start\n");
                return NOK;
        }

        if (0 != startID)
        {
                printf("process consecutive set vlanID\n");
                for (i = startID; i <= endID; ++i)
                {
                        g_port[port][i] = 1;
                }
        }
        else
        {
                printf("process SINGLE set...\n");
                g_port[port][endID] = 1;
        }

        return OK;
}
 楼主| 发表于 2013-5-5 22:50:13 | 显示全部楼层
import string
from ftplib import FTP
bufsize=1024
def Get(filename):
    command='RETR '+filename
    ftp.retrbinary(command,open(filename,'wb').write,bufsize)
    print 'download successfully'
def Put(filename):
    command='STOR '+filename
    filehandler=open(filename,'rb')
    ftp.storbinary(command,filehandler,bufsize)
    filehandler.close()
    print 'upload successfully'
def PWD():
    print ftp.pwd()
def Size(filename):
    print ftp.size(filename)
def Help():
    print '''
    ==============================
         Simple Python FTP
    ==============================
    cd       enter document
    delete   delete file
    dir      get files list
    get      download file
    help     help
    mkdir    create document
    put      upload file
    pwd      get current path
    rename   rename file name
    rmdir    delete document
    size     get file size
    '''
server=raw_input('enter FTP server info: ')
ftp=FTP(server)
username=raw_input('username:')
password=raw_input('password')
ftp.login(username,password)
print ftp.getwelcome()
actions={'dir':ftp.dir,'pwd'WD,'cd':ftp.cwd,'get':Get,
         'put'ut,'help':Help,'rmdir':ftp.rmd,
         'mkdir':ftp.mkd,'delete':ftp.delete,
         'size':Size,'rename':ftp.rename}
while True:
    print 'pyftp',
    cmds=raw_input
    cmd=string.split(cmds)
    try:
        if len(cmd)==1:
            if string.lower(cmd[0])=='quit':
                break
            else:
                actions[string.lower(cmd[0])]
        elif len(cmd)==2:
            actions[string.lower(cmd[0])](cmd[1])
        elif len(cmd)==3:
            actions[string.lower(cmd[0])](cmd[1],cmd[2])
        else:
            print 'type error'
    except:
        print 'command error'
ftp.quit()
 楼主| 发表于 2013-5-5 23:01:12 | 显示全部楼层
from ftplib import FTP

HOST   = "localhost"
UNAME  = "foo"
PASSWD = "bar"
DIR    = "pub"
FILE   = "test.test"

def download_cb(block):
    file.write(block)

ftp = FTP(HOST)
ftp.login(user=UNAME, passwd=PASSWD)
ftp.cwd(DIR)

file = open(FILE, "wb")
ftp.retrbinary("RETR " + FILE, download_cb)
file.close()
ftp.close()
 楼主| 发表于 2013-5-8 18:28:13 | 显示全部楼层
本帖最后由 goodlook 于 2013-5-8 23:39 编辑

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

#define TRUE        1
#define FALSE        0
#define OK                  0
#define NOK                1
#define BUSY        1
#define SPARE        0

#define _D_RETURN_IF_MALLOC_ERR(p, errno)        if(NULL == p){return errno;}
#define MEM_BLK_SIZE        16

/* 内存节点属性结构体 */
typedef struct tagS_MEMORY_NODE
{
        size_t ulBlockIndex;
/* 内存块序号 */
        size_t ulNumUserBlock;
/* 用户指定的内存块个数 */
        struct tagS_MEMORY_NODE *pstNext;/* 下一个节点指针 */
}S_NODE_ATTRIB;

static void *g_pMemory = NULL;
/* 内存池首地址 */
static size_t g_ulNumTotalBlock = 0;
/* 内存池的内存块个数 */
static int *g_pBlockFlag = NULL;
/* 内存池的内存块有效标志 */
static S_NODE_ATTRIB *g_pstAttribNodeHead = NULL;
/* 内存节点属性链表头 */

/*********************************************************************
函 数 名  : k_malloc_setnull
功能描述  : 分配堆空间,并将所分配的空间置0
输入参数  : k_size 欲分配的堆空间大小
输出参数  :
返 回 值  : void*
********************************************************************/
void *k_malloc_setnull(size_t k_size)
{
        void *p = malloc(k_size);
        _D_RETURN_IF_MALLOC_ERR(p, NULL);

        memset((char *)p, 0, k_size);

        return p;
}

/*********************************************************************
函 数 名  : addOneNodeToList
功能描述  : 单链表操作,在尾部加入一个节点
输入参数  : ppstNodeHead 链表头部指针的地址(链表头部指针由调用者定义)
                         pstNodeToInset 欲插入的节点指针
输出参数  : ppstNodeHead 链表头部指针的地址(链表头部指针由调用者定义)
返 回 值  : int
********************************************************************/

int addOneNodeToList(S_NODE_ATTRIB **ppstNodeHead, S_NODE_ATTRIB *pstNodeToInset)
{
        S_NODE_ATTRIB *pstNodePrev = NULL;
        S_NODE_ATTRIB *pstNodeCur = *ppstNodeHead;

        //没有一个节点
        if (NULL == *ppstNodeHead)
        {
                *ppstNodeHead = pstNodeToInset;
        }
        else
        {
                //已有节点,插入末尾
                while (NULL != pstNodeCur)
                {
                        pstNodePrev = pstNodeCur;
                        pstNodeCur = pstNodeCur->pstNext;
                }
                pstNodePrev->pstNext = pstNodeToInset;
        }

        return 0;
}

static size_t memGetNumTotalBlock(void)
{

return g_ulNumTotalBlock;
}

static void memSetNumTotalBlock(size_t ulNumTotalBlock)
{

g_ulNumTotalBlock = ulNumTotalBlock;

printf("g_ulNumTotalBlock = %d\n", g_ulNumTotalBlock);



return;
}

static void memSetBlockFlag(size_t ulStart, size_t ulLen, int lValue)
{
    size_t i = 0;

    for (i = 0; i < ulLen; ++i)
    {

*(g_pBlockFlag + ulStart + i) = lValue;
    }

    return;
}

static void memClearBlockFlag(size_t ulBlockIndex, size_t ulNumBlock)
{

memSetBlockFlag(ulBlockIndex, ulNumBlock, FALSE);



return;
}

static void *memGetMemoryStartAddress(void)
{

return g_pMemory;
}

static int memMallocMemory(size_t ulSize)
{

size_t ulNumTotalBlock = 0;


g_pMemory = (void *)k_malloc_setnull(ulSize);

_D_RETURN_IF_MALLOC_ERR(g_pMemory, NOK);


/* 分配内存块标志的空间 */

ulNumTotalBlock = ulSize / MEM_BLK_SIZE;

memSetNumTotalBlock(ulNumTotalBlock);

g_pBlockFlag = (int *)k_malloc_setnull(ulNumTotalBlock * sizeof(int));

_D_RETURN_IF_MALLOC_ERR(g_pBlockFlag, NOK);


return OK;
}

static void memFreeMallocedMemory(void)
{

if (NULL != g_pMemory)

{

free(g_pMemory);

g_pMemory = NULL;

}


memClearBlockFlag(0, memGetNumTotalBlock());


return;
}

/*********************************************************************
函 数 名  : static int memFindAddrAndFreeMemory(size_t ulAddr)
功能描述  : 单链表操作,删除一个节点
输入参数  :
输出参数  :
返 回 值  : int
********************************************************************/
static int memFindAddrAndFreeMemory(size_t ulAddr)
{
        S_NODE_ATTRIB *pstNodeCur = g_pstAttribNodeHead;
        S_NODE_ATTRIB *pstNodePrev = NULL;
        size_t ulAddrRecorded = 0;

        for (pstNodeCur = g_pstAttribNodeHead; NULL != pstNodeCur;
                        (pstNodePrev = pstNodeCur, pstNodeCur = pstNodeCur->pstNext))
        {
                ulAddrRecorded = (size_t)memGetMemoryStartAddress()
                                                                                        + MEM_BLK_SIZE * pstNodeCur->ulBlockIndex;
                if (ulAddr == ulAddrRecorded)
                {
                        memClearBlockFlag(pstNodeCur->ulBlockIndex, pstNodeCur->ulNumUserBlock);
                        /* 链表头 */
                        if (pstNodeCur == g_pstAttribNodeHead)
                        {
                                g_pstAttribNodeHead = pstNodeCur->pstNext;
                        }
                        /* 尾巴和中间 */
                        else
                        {
                                pstNodePrev->pstNext = pstNodeCur->pstNext;
                        }
                        free(pstNodeCur);

                        return OK;
                }
        }

        return NOK;
}


static int memGetStartIndexOfBlocks(size_t ulNumBlock, size_t *pulIndex)
{
        size_t i = 0;
        size_t ulNumResult = 0;
        size_t ulNumResultTmp = 0;
        size_t ulNumTotalBlock = 0;

        if (NULL == g_pBlockFlag)
        {
                printf("g_pMemoryFlag is NULL...\n");
                return NOK;
        }

        ulNumTotalBlock = memGetNumTotalBlock();
        for (i = 0; i < ulNumTotalBlock; ++i)
        {
                if (SPARE == *(g_pBlockFlag + i))
                {
                        ulNumResult++;
                }
                else
                {
                        ulNumResultTmp = ulNumResult > ulNumResultTmp ? ulNumResult : ulNumResultTmp;
                        if (ulNumBlock <= ulNumResultTmp)
                        {
                                printf("line %d: address index of Block = %d\n", __LINE__, i - ulNumResultTmp);
                                *pulIndex = i - ulNumResultTmp;

                                return OK;
                        }
                        ulNumResult = 0;
                }
        }
        ulNumResultTmp = ulNumResult > ulNumResultTmp ? ulNumResult : ulNumResultTmp;
        if (ulNumBlock <= ulNumResultTmp)
        {
                printf("line %d: address index of Block = %d\n", __LINE__, i - ulNumResultTmp);
                *pulIndex =  i - ulNumResultTmp;

                return OK;
        }

        return NOK;
}

void debug_print_flag(void)
{
        size_t i = 0;
        size_t ulNum = memGetNumTotalBlock();
        static size_t ulCount = 0;

        printf("check memory flag===%d===\n", ulCount++);
        for (i = 0; i < ulNum; ++i)
        {

printf("%d ", *(g_pBlockFlag + i));
        }
        printf("\n");

        return;
}

/****************************************************************
Description  : 检查欲分配的内存大小
Prototype    : static int memCheckMemSize(size_t ulMemSize)
Parameters   : size_t ulMemSize - 欲分配的内存池大小(单位Byte)

  大小为MEM_BLK_SIZE的整数倍
Return Value : int - 成功返回OK
                     失败返回NOK
*****************************************************************/
static int memCheckMemSize(size_t ulMemSize)
{

if (0 == ulMemSize

|| ulMemSize % MEM_BLK_SIZE)

{

return NOK;

}



return OK;
}

/****************************************************************
Description  : 初始化内存池
Prototype    : void* InitMemPool(size_t mem_pool_size)
Parameters   : size_t mem_pool_size - 初始的内存池大小(单位Byte)
Return Value : void* - 成功返回内存池首地址
                       失败返回NULL
*****************************************************************/
void* InitMemPool(size_t mem_pool_size)
{

/* 检查内存大小是否合法 */

if (OK != memCheckMemSize(mem_pool_size))

{

return NULL;

}

/* 分配内存池及其标志空间 */

if (OK != memMallocMemory(mem_pool_size))

{

return NULL;

}


return memGetMemoryStartAddress();
}

/******************************************************************
Description  : 销毁内存池
Prototype    : void DestroyMemPool(void)
Parameters   : 无
Return Value : void
*******************************************************************/
void DestroyMemPool(void)
{

/* 释放已分配的内存池及其标志空间 */

memFreeMallocedMemory();

/* 清0内存池的内存块个数 */

memSetNumTotalBlock(0);

/* 释放内存节点属性链表 */

//freeAllNode();


return;
}

/******************************************************************
Description  : 申请内存
Prototype    : void* MemAlloc(size_t user_blk_size)
Parameters   : size_t user_blk_size – 申请的内存大小(单位byte)
Return Value : void* - 成功则返回可使用的内存区域地址
                       失败返回NULL

*******************************************************************/
void* MemAlloc(size_t user_blk_size)
{
        size_t ulNumUserBlock = user_blk_size / MEM_BLK_SIZE;
        size_t total_m = memGetNumTotalBlock();
        S_NODE_ATTRIB *pstNodeTmp = NULL;
        void *pMemory = NULL;
        size_t ulBlockIndex = 0;

        printf("ulNumUserBlock = %d\n", ulNumUserBlock);

        if (OK != memGetStartIndexOfBlocks(ulNumUserBlock, &ulBlockIndex))
        {
                printf("space NOT enough...\n");
                return NULL;
        }

        memSetBlockFlag(ulBlockIndex, ulNumUserBlock, TRUE);

        pMemory = (void *)((char *)memGetMemoryStartAddress() + MEM_BLK_SIZE * ulBlockIndex);
        /* 填充数据 */
        pstNodeTmp = (S_NODE_ATTRIB *)k_malloc_setnull(sizeof(S_NODE_ATTRIB));
        _D_RETURN_IF_MALLOC_ERR(pstNodeTmp, NULL);
        /* 填充数据 */
        pstNodeTmp->ulNumUserBlock = ulNumUserBlock;
        pstNodeTmp->ulBlockIndex = ulBlockIndex;
        /* 将新增节点加入链表 */
        addOneNodeToList(&g_pstAttribNodeHead, pstNodeTmp);

        debug_print_flag();
        printf("mem_addr = [%p]\n", pMemory);

        return pMemory;
}

/******************************************************************
Description  : 释放内存
Prototype    : int MemFree(void* mem_addr)
Parameters   : void* mem_addr - 要释放的内存地址
Return Value : int - 成功返回0
                     失败返回-1
*******************************************************************/
int MemFree(void* mem_addr)
{
        if (NULL == mem_addr)
        {
                return -1;
        }

        if (OK != memFindAddrAndFreeMemory((size_t)mem_addr))
        {

printf("mem_addr NOT exist...\n");

return -1;
        }


debug_print_flag();

        return 0;
}

int main(void)
{

void *pStart = NULL;

void *pAlloc = NULL;

size_t addr = 0x12345678;


pStart = InitMemPool(MEM_BLK_SIZE * 6);

assert(NULL != pStart);

printf("pStart = %p\n\n", pStart);


MemAlloc(MEM_BLK_SIZE * 2);

MemAlloc(MEM_BLK_SIZE * 1);

MemAlloc(MEM_BLK_SIZE * 2);



printf("input the address to free: ");

scanf("%x", &addr);

MemFree((void *)addr);

printf("input the address to free: ");

scanf("%x", &addr);

MemFree((void *)addr);


MemAlloc(MEM_BLK_SIZE * 3);

return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 19:32 , Processed in 0.029846 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表