免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2207 | 回复: 9
打印 上一主题 下一主题

[C] [color=Red][求助]协议代码 有些语法弄不明白 大家帮忙分析一下!*********[/color] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-01 16:04 |只看该作者 |倒序浏览
// WSP_PDU.def 文件

PDU(Connect, "...",
        TYPE(8, 1)
        UINT(version, "WSP protocol version", 8)
        UINTVAR(capabilities_len, "Length of capabilities")
        UINTVAR(headers_len, "Length of session headers")
        OCTSTR(capabilities, "Requested capabilities", capabilities_len)
        OCTSTR(headers, "Session headers", headers_len)
        , 1)



//WSP_PDU.C 文件

//开始定义数据包结构体
struct wsp_pdu {
        int type;

        union {
/* For each PDU, declare a structure with its fields, named after the PDU */
#define PDU(name, docstring, fields, is_valid) struct name { fields } name;
#define UINT(field, docstring, bits) unsigned long field;
#define UINTVAR(field, docstring) unsigned long field;
#define OCTSTR(field, docstring, lengthfield) Octstr *field;
#define REST(field, docstring) Octstr *field;
#define TYPE(bits, value)
#define RESERVED(bits)
#define TPI(confield)
#include "wsp_pdu.def"    // 问: 这里将WSP_PDU.DEF 文件 include 进来是出于什么目的呢?
#undef RESERVED
#undef TYPE
#undef REST
#undef OCTSTR
#undef UINTVAR
#undef UINT
#undef PDU
        } u;
};


// 组包函数

WSP_PDU *wsp_pdu_unpack(Octstr *data) {
        WSP_PDU *pdu = NULL;
        long bitpos = 0;

        gw_assert(data != NULL);

        pdu = gw_malloc(sizeof(*pdu));

        pdu->type = wsp_pdu_type(data);

        switch (pdu->type) {
#define PDU(name, docstring, fields, is_valid) \
        case name: { \
                struct name *p = &pdu->u.name; \
                fields \
                gw_assert(bitpos % 8 == 0); \
                if (bitpos / 8 != octstr_len(data)) { \
                        warning(0, "Bad length for " #name " PDU, " \
                                "expected %ld", bitpos / 8); \
                } \
                if (!(is_valid)) { \
                        warning(0, #name " PDU failed %s", #is_valid); \
                } \
        } break;
                   // 问:这里是在做什么呢?  为什么在这里要定义  #define PDU(name, docstring, fields, is_valid)
#define UINT(field, docstring, bits) \
        p->field = octstr_get_bits(data, bitpos, (bits)); \
        bitpos += (bits);
#define UINTVAR(field, docstring) \
        gw_assert(bitpos % 8 == 0); \
        p->field = octstr_get_bits(data, bitpos + 1, 7); \
        while (octstr_get_bits(data, bitpos, 1)) { \
                bitpos += 8; \
                p->field <<= 7; \
                p->field |= octstr_get_bits(data, bitpos + 1, 7); \
        } \
        bitpos += 8;
#define OCTSTR(field, docstring, lengthfield) \
        gw_assert(bitpos % 8 == 0); \
        p->field = octstr_copy(data, bitpos / 8, p->lengthfield); \
        bitpos += 8 * p->lengthfield;
#define REST(field, docstring) \
        gw_assert(bitpos % 8 == 0); \
        if (bitpos / 8 <= octstr_len(data)) { \
                p->field = octstr_copy(data, bitpos / 8, \
                                octstr_len(data) - bitpos / 8); \
                bitpos = octstr_len(data) * 8; \
        } else { \
                p->field = octstr_create(""); \
        }
#define TYPE(bits, value) bitpos += (bits);
#define RESERVED(bits) bitpos += (bits);
#include "wsp_pdu.def"     //问:再次 将DEF 文件include 进来有什么用呢?
#undef TYPE
#undef REST
#undef OCTSTR
#undef UINTVAR
#undef UINT
#undef PDU
        default:
                warning(0, "WSP PDU with unknown type %d", pdu->type);
                gw_free(pdu);
                return NULL;
        }

        return pdu;
}





请高手解答一下哈

[ 本帖最后由 longhongxu 于 2008-7-1 16:19 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-01 16:15 |只看该作者
up

论坛徽章:
0
3 [报告]
发表于 2008-07-01 17:05 |只看该作者
难道没人愿意解答一二?



顶回去

论坛徽章:
0
4 [报告]
发表于 2008-07-02 08:46 |只看该作者
用了define大部分都是为了偷懒,不过这兄弟偷的有意思
一直还没试过这种搞法

论坛徽章:
0
5 [报告]
发表于 2008-07-02 09:24 |只看该作者
他是怎么把.def文件中的数据取出来放到C中去的呢? 看他现在的做法像是用的define ,所以搞不明白

论坛徽章:
0
6 [报告]
发表于 2008-07-02 11:13 |只看该作者

回复 #5 longhongxu 的帖子

可以把它看作头文件

论坛徽章:
0
7 [报告]
发表于 2008-07-02 12:04 |只看该作者
那为什么要多次include呢?

可以帮我讲解一下他怎么做是怎么传值的马?就是。def文件中的结构怎么背赋给。c 文件中的define PDU(name, docstring, fields, is_valid) 中来的

论坛徽章:
0
8 [报告]
发表于 2008-07-03 09:41 |只看该作者
UP

论坛徽章:
0
9 [报告]
发表于 2008-07-03 17:29 |只看该作者
up

论坛徽章:
0
10 [报告]
发表于 2008-07-04 13:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP