📄 嵌入式web服务器中tcp-ip协议栈的实现的研究--《plc&fa》网络版.htm
字号:
<P><FONT color=#008284>4
嵌入式Web服务器中TCP/IP栈的实现</FONT><BR>嵌入式Web服务器中TCP/IP栈实现时是分模块进行的,分别有ARP模块,IP模块,ICMP模块,HTTP模块。以ARP模块为例介绍一下本文作者的实现方法。<BR><FONT
color=#008284>4.1 ARP模块的实现</FONT><BR>ARP
协议头部定义:<BR>struct
arp<BR>{<BR>WZK_SAL_PACKED_FIELD(wzk_uint16
hartype);<BR>/* 硬件类型
*/<BR>WZK_SAL_PACKED_FIELD(wzk_uint16 proto); <BR>/*
协议类型 */<BR>WZK_SAL_PACKED_FIELD(wzk_uint8
hadrlen);<BR>/*
硬件地址长度*/<BR>WZK_SAL_PACKED_FIELD(wzk_uint8 prolen);
<BR>/* 协议地址长度 */<BR>WZK_SAL_PACKED_FIELD(wzk_uint16
opcode);<BR>/* 操作码 */<BR>WZK_SAL_PACKED_FIELD(wzk_byte
addrs[1]); <BR>/* 源硬件地址、源协议地址、目标硬件地址、目标协议地址 */<BR>}
WZK_SAL_PACKED_STRUCT;<BR>WZK_SAL_PACKED_STRUCT宏保证整个结构体在内存中紧凑排列。<BR>ARP协议的实现主要由下列4个函数完成:<BR>(1)
void etherarp_init (struct netif
*netif);<BR>初始化函数。在整个协议栈初始化时运行。主要工作就是把ARP映射表中的所有映射项初始化为0,并且如果网络接口设置了默认网关,将发送ARP请求获取默认网关的MAC地址。<BR>(2)
void etherarp_input (struct buffer *buf, struct buffer
*validbuf, struct
netif*netif);<BR>ARP输入处理。主要工作就是处理接收到的ARP
请求和ARP响应。<BR>(3) void
etherarp_timer(void);<BR>ARP定时处理。该函数由嵌入式Web服务器中TCP/IP栈全局的定时器负责调用执行。主要工作就是将所有ARP映射项的定时器加1,然后根据所处状态做响应的处理。<BR>(4)
struct ether_addr* etherarp_lookup4 (struct netif
*netif, struct
addr*ipaddr);<BR>查询以太网MAC地址。该函数供网络接口发送帧时获得目标主机的MAC地址。<BR>ARP定时处理过程伪代码:<BR>for(i=0;i<
WZK_CONFIG_PARAM_EMWEBARP_ CACHE_SIZE;
i++)<BR>{if(WZK_EMWEBARP_GET_STATE(arpcache [i]) ==
FREE)/* 如果ARP映射项的状态是未用
*/<BR>{continue;}<BR>WZK_EMWEBARP_SET_TIMER(arpcache[i],<BR>WZK_EMWEBARP_GET_TIMER(arpcache[i])+1);
<BR>/* 将 ARP 映射项的定时器加 1
*/<BR>if(WZK_EMWEBARP_GET_STATE(arpcache[i]) == PENDING)
<BR>/* 若ARP映射项的状态是解析中
*/<BR>{if(WZK_EMWEBARP_GET_TIMER(arpcache[i]) ><BR>/*
如果定时器大于解析中状态延时
*/<BR>WZK_CONFIG_PARAM_EMWEBARP_CACHE<BR>_PENDING_TIMEOUT)
<BR>{#ifdef WZK_CONFIG_FUNC_EMWEBARP
_RETRY_QUERY<BR>if(WZK_EMWEBARP_GET_RETRY(arpcache[i])<
<BR>/* 若ARP请求重传次数小于最大重传次数
*/<BR>WZK_CONFIG_PARAM_EMWEBARP_MAX_RETRY_QUERY)<BR>{emwebarp_query(i); <BR>/*
重传 ARP 请求
*/<BR>WZK_EMWEBARP_SET_RETRY(arpcache[i],<BR>WZK_EMWEBARP_GET_RETRY(arpcache[i])+1);<BR>/*
重传次数加 1 */}<BR>else {WZK_EMWEBARP_SET_STATE(arpcache[i],
FREE); <BR>/* 设置 ARP 映射项的状态为未用
*/<BR>continue;}<BR>#else
WZK_EMWEBARP_SET_STATE(&arpcache4[i], FREE); <BR>/*
设置 ARP 映射项的状态为未用
*/<BR>continue;<BR>#endif}}<BR>if(WZK_EMWEBARP_GET_STATE(arpcache[i])
== RESOLVED) <BR>/* 若ARP映射项的状态是可用
*/<BR>{if(WZK_EMWEBARP_GET_TIMER(arpcache[i])
><BR>/*若定时器大于可用状态延时
*/<BR>WZK_CONFIG_PARAM_EMWEBARP_CACHE<BR>_PENDING_TIMEOUT)<BR>/*若定时器大于可用状态延时
*/<BR>{WZK_EMWEBARP_SET_STATE(arpcache[i], PENDING); /*
更新 ARP 映射项 */<BR>WZK_EMWEBARP_SET_TIMER(arpcache[i],
0);<BR>emwebarp_query4(i);<BR>continue;}}}
</P>
<P><FONT color=#008284>5
测试结果及分析</FONT><BR>在x86硬件体系结构下进行了测试。<BR><FONT
color=#008284>5.1
测试环境</FONT><BR>CPU:奔腾II266M;内存:128M;操作系统:Redhat
Linux9<BR><FONT color=#008284>5.2
测试目的</FONT><BR>(1) 确认ARP协议功能正确;<BR>(2)
确认在x86体系结构下编译后的代码尺寸和内存开销。<BR><FONT
color=#008284>5.3 测试方法</FONT><BR>(1)
配置嵌入式Web服务器的协议栈,可以根据需要选择打开嵌入式Web服务器协议栈WZK_DEBUG选项,并通过GCC进行编译,连接,生成vipstack.o库;(2)
编写测试程序,采用Linux中pcap库,通过捕获ARP数据包,并将捕获到的ARP数据包输入嵌入式Web服务器协议栈,由嵌入式Web服务器协议栈进行处理;重定向嵌入式Web服务器协议栈的输出到屏幕上,也就是在屏幕上显示出嵌入式Web服务器协议栈输出的数据包的数据。(3)
编译测试程序,并和vipstack.o连接,生成可执行测试程序;(4)
运行测试程序,对比输出信息,如果打开了嵌入式Web服务器协议栈WZK_DEBUG选项,则可以观察输出的调试信息。<BR><FONT
color=#008284>5.4 测试结果<BR></FONT>(1)
ARP协议功能正确;<BR>(2)
ARP协议代码最小为1.2K,运行时内存开销最小为80字节。<BR>以上是对嵌入式Web服务器协议栈中ARP协议模块实现时的编程和调试方法,经过测试,可知精简压缩后的ARP能够实现ARP的基本功能。同样对嵌入式Web服务器协议栈中所选择的IP模块,ICMP模块,HTTP模块也做了相应的删减和压缩,在实验室环境下已经对ICMP模块进行了测试,取得了预想的效果。由于本篇篇幅限制,这儿没给出ICMP模块的试验代码。IP和HTTP模块还在进一步修改和验证之中。希望能够得到预期目标。</P>
<P><FONT color=#008284>6
结束语</FONT><BR>通过对TCP/IP协议族的精简,初步判断能够在嵌入式系统有限的资源上实现通过嵌入式Web服务器提供HTTP服务,从而实现嵌入式系统联入internet。这样,既兼顾了TCP/IP协议的主要功能的实现,又照顾到嵌入式系统本身的弱点,达到在嵌入式系统中实现HTTP服务的目的。</P></TD></TR>
<TR>
<TD colSpan=2> </TD></TR>
<TR>
<TD align=right colSpan=2 height=25><FONT
color=#993333>本文摘自《PLC&FA》</FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=middle height=40>
<TABLE cellSpacing=0 cellPadding=4 width="99%" bgColor=#e6f4fb
border=0>
<TBODY>
<TR>
<TD
background=嵌入式WEB服务器中TCP-IP协议栈的实现的研究--《PLC&FA》网络版.files/16.jpg
height=20>共有网友评论0条【<A
href="http://www.plc-fa.hk/comment.asp?topictype=2&topicid=3972"
target=_blank>查看所有评论</A>】【推荐给好友】【<A
href="javascript:window.print()">打印</A>】</TD></TR>
<TR>
<TD></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=1 cellPadding=5 width="99%" bgColor=#e7f7ff
border=0>
<TBODY>
<TR>
<TD align=middle><STRONG>发表对此文评论</STRONG></TD></TR>
<TR>
<TD align=middle>
<FORM action=postcomment.asp method=post>
<TABLE cellSpacing=0 cellPadding=3 width=300 border=0>
<TBODY>
<TR>
<TD height=91><TEXTAREA style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: 1px solid; WIDTH: 250px; BORDER-BOTTOM: 1px solid; HEIGHT: 100px; BACKGROUND-COLOR: #ffffff" name=content rows=6 cols=55></TEXTAREA>
</TD></TR>
<TR>
<TD align=middle><INPUT style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: 1px solid; WIDTH: 60px; BORDER-BOTTOM: 1px solid; FONT-FAMILY: 宋体; HEIGHT: 20px" type=submit value=提交 name=Submit>
<INPUT type=hidden value=3972 name=topicid> <INPUT
type=hidden value=嵌入式WEB服务器中TCP/IP协议栈的实现的研究
name=topicname> </TD></TR></TBODY></TABLE><INPUT type=hidden
value=2
name=topictype><BR></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=2 width=770 border=0>
<TBODY>
<TR>
<TD class=666666 vAlign=bottom align=middle width=171 bgColor=#ebebeb
height=20> </TD>
<TD class=666666 vAlign=bottom align=middle width=397 bgColor=#ebebeb><A
class=666666 href="http://www.plc-fa.hk/about.asp">杂志简介</A> | <A
href="http://www.plc-fa.hk/about1.asp">发行分析</A> | <A class=666666
href="http://www.plc-fa.hk/ad.asp">广告预订</A> | <A class=666666
href="http://www.plc-fa.hk/doonline.asp">在线投稿</A> | <A class=666666
href="http://www.ca800.com/book/showmaga.asp?id=66" target=_blank>在线订阅</A>
</TD>
<TD class=666666 vAlign=bottom align=middle width=190 bgColor=#ebebeb><A
href="http://www.servo.hk/" target=_blank><FONT
color=#ff0000>伺服控制</FONT></A> <A
href="http://www.inverterworld.hk/" target=_blank><FONT
color=#ff0000>变频器世界</FONT></A></TD></TR>
<TR>
<TD bgColor=#666666 colSpan=3 height=1></TD></TR>
<TR>
<TD class=666666 align=middle colSpan=3>©2005 东方国际科技传媒有限公司版权所有
未经许可不得转载</TD></TR>
<TR>
<TD colSpan=3> </TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript>
var __cc_style = 0;
var __cc_uid="ca800";
</SCRIPT>
<SCRIPT language=JavaScript src="">
</SCRIPT>
<SCRIPT src="嵌入式WEB服务器中TCP-IP协议栈的实现的研究--《PLC&FA》网络版.files/urchin.js"
type=text/javascript>
</SCRIPT>
<SCRIPT type=text/javascript>
_uacct = "UA-154698-8";
urchinTracker();
</SCRIPT>
</CENTER>
<SCRIPT>document.write(unescape("%3Cscript%3Edocument.oncontextmenu%3Dnew%20Function%28%22event.returnValue%3Dfalse%22%29%0D%0Adocument.onselectstart%3Dnew%20Function%28%22event.returnValue%3Dfalse%22%29%3C/script%3E"))</SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -