W5100E01-AVR是什么?怎么用?(五)(用户手册V1.0版)
0赞W5100E01-AVR是为AVR开发者提供的W5100评估板。本文是W5100E01-AVR的用户手册,希望对大家有所帮助。今天我们接着昨天的博文继续介绍:
第一部分在这里:W5100E01-AVR是什么?怎么用?(用户手册V1.0版)
第二部分在这里:W5100E01-AVR是什么?怎么用?(二)(用户手册V1.0版)
第三部分在这里:W5100E01-AVR是什么?怎么用?(三)(用户手册V1.0版)
第四部分在这里:W5100E01-AVR是什么?怎么用?(四)(用户手册V1.0版)
3.2.6.3.Loopback UDP
Loopback UPD程序是一个使用UDP协议的单播数据包通信的程序,操作流程与Loopback TCP客户/服务器相同。UDP通信包括单播数包通信和广播数据包通信,并且基本上支持使用单一信道与多目的地址通信的一对多通信方式。
Loopback UDP程序使用Loopback _udp()函数,Loopback _udp()函数的流程图如<图3 -16>所示。
当处于in SOCK_CLOSED状态下,使用SOCK_DGRAM、端口号和选项标志位作为参数创建UDPsocket调用socket(),
与TCP通信正好相反,UDP数据通信是一个没有要求连接过程的通信。因此,当创建socket后,可以直接进行数据通信。创建UDPsocket后,UDP socket的状态会从SOCK_CLOSED变成SOCK_UDP。
这里,UDP使用sendto()函数和recvfrom()函数,而不像TCP数据通信使用send() 函数and recv()函数。
这是因为TCP是确定目的地址的一对一通信,而UDP是没有连接程序的一对多通信。sendto()函数将数据作为一个参数发送给特定地址的特定端口,recvfrom()函数则从临时的端口接收传来的数据。recvfrom()函数通知用户使用作为参数发送的destip和destport来接收目的地址的信息。
在Loopback _udp()函数中,没有使用close()函数的例子,但是如果我们不再需要UDP通信,通常也可以调用close()函数关闭UDP socket。
3.2.6.4. Web服务
Web服务器程序是使用运行在TCP协议上的HTTP协议的TCP服务器程序。在建立Web服务器程序之前,我们需要了解在Web服务器和Web客户(浏览器)之间传输消息的HTTP协议消息结构。
HTTP(超文本传输协议)是因特网中在Web服务器和客户浏览器之间传输数据使用的协议。
Web服务器程序分析函数和从浏览器接收到的HTTP请求消息的URI(统一资源标示符)。如果相关的URI只是单纯的页面请求,这个页面会发送。如果URI请求一个行为,例如CGI(公共网关接口),它会采取行动并将结果显示在页面中。
<图3.17>所示为web服务器和web客户端之间的HTTP信息流,<表3-28>所示为HTTP信息结构。
想了解更多关于HTTP的信息,请参考RFC2616。HTTP请求信息根据浏览器类型的不同而改变,<表3-29>所示为Windows 2000的浏览器和评估板上的HTTP信息通信的例子。
Web服务器程序由管理HTTP服务器socket的of web_server()函数和管理HTTP信息的函数组成。
<图3.18>所示为web_server()函数流程图。
因为web_server()是TCP服务器程序,所以它的创建跟3.2.6.1讲的Loopback _tcps()函数类似,web_server()和Loopback _tcps()不同的地方在于数据通信代码。web_server()函数调用从处于SOCK_ESTABLISHED状态下的http socket的HTTP请求的proc_http()函数。
在调用proc_http()函数后,web_server()等待从网页的HTTP请求的HTTP响应信息,再调用disconnect()函数关闭http socket。
这个socket的关闭称为主动关闭,这种情况下,评估板首先请求客户关闭。供您参见,被动关闭是在客户请求无法第一时间建立连接的情况下。Web服务器支持主动关闭的原因是评估板支持服务器与其他客户端进行连接。
<图3‑19: proc_http()函数>
proc_http()函数调用parse_http_request()函数分析从浏览器接收的HTTP请求信息。如果分析的HTTP请求是“GET”、“HEAD或“POST”方法,就调用get_http_uri_name()函数,并从HTTP请求信息中提取URI名称。如果URI名称为“/”,用评估板的Web服务器的默认页面“index.html”代替“/”,因为这表示浏览器请求的是Web服务器的默认页面。
通过调用find_http_uri_type()函数得到HTTP请求信息的HTTP请求类型后,如果HTTP请求类型是“CGI”,它就会执行相应的CGI指令的流程。
处理完CGI命令或当HTTP请求不是CGI类型时,就通过URI名称搜索从评估板创建的ROM文件镜像。
如果检索到文件,就创建HTTP响应信息并发送。
HTTP响应信息包括HTTP响应头传输和HTTP响应文本传输。对于HTTP响应头传输,它使用HTTP请求类型作为参数调用make_http_response_head()函数去创建HTTP响应头。传输完创建HTTP响应头后,就开始传输HTTP响应文本。例如,如果HTTP响应文本是ROM文件镜像中的任意文件,这个文件就比W5100的MTU(最大传输单元)大很多。因此,在传输之前,必须以W5100的最大值为基准将它分割。在这点上,如果在评估板中定义的系统环境变量在HTTP响应文本中存在,就调用replace_sys_env_value()函数,并用评估板中存储的系统环境变量值取代原有的。
<表3-30>是评估板的ROM文件镜像“evbctrl.html”的一部分。
评估板的系统环境变量的长度变化是根据系统环境变量值来确定并代替它,例如,假设EVB的IP地址用字符串表示,那么最大长度就是16,因此,$SRC_IP_ADDRESS$的长度也是16。我们可以使用WIZnet公司提供的“ROMFileMaker.exe”创建评估板的ROM文件系统,想了解更多,请参考“ROM File Maker Manual Vx.x.pdf”。
HTTP请求信息可以分为方法和请求地址,后者由parse_http_request()函数解析并保存在‘st_http_request’数据类型中,具体定义如<表3-31>,通过get_http_uri_type()函数得到相应的URI类型。
请求地址保存在st_http_request的URI [MAX_URI_SIZE]中,URI名称在“?”符号之前,查询字符串在“?”符号之后。当请求地址从浏览器转变为Web服务器时,空格字符转换成‘+’的形式,剩下其它的文本转换成十六进制的形式。因此,请求地址的字符需要反编码成原先的值,从‘+’到空格,从十六进制转换成相关的ASCII码值,具体Request-URI的编码信息参见RFC1738。请求地址的URI名称通过get_http_uri_name()函数得到,请求地址的查询字符串可以包含一个或者更多的“variable=value”对,以“&”作为分隔符。通过get_http_param_value()函数,请求地址可以在查询字符串中取得期望的值。
评估板的Web服务器图像处理与传统Web服务器程序处理程序有所不同,传统的Web服务器程序处理程序是基于操作系统的,通过分离的独立过程进行进程间的通信。但是,评估板的Web服务器不需要操作系统,因此,它不需要创建独立进程,而是通过调用相关函数直接进行图像处理。评估板支持用于更新网络信息的“NETCONF.CGI”和控制字符LCD、评估板发光二极管的的D1/D2的“LCDNLED.CGI”,<图3.23>和<图3.24>显示了两个图像处理的过程。
NETCONF.CGI的