W5100E01-AVR(W5100评估板用户手册)(四)

Home / 博客 / W5100E01-AVR(W5100评估板用户手册)(四)

W5100E01-AVR是为AVR开发者提供的W5100评估板。本文是W5100E01-AVR的用户手册,希望对大家有所帮助。今天我们接着昨天的博文继续介绍:

第一部分在这里:W5100E01-AVR是什么?怎么用?(用户手册V1.0版)

W5100E01-AVR(W5100评估板用户手册)(一)

第二部分在这里:W5100E01-AVR是什么?怎么用?(二)(用户手册V1.0版)

W5100E01-AVR(W5100评估板用户手册)(二)

第三部分在这里:W5100E01-AVR是什么?怎么用?(三)(用户手册V1.0版)

W5100E01-AVR(W5100评估板用户手册)(三)

 

3.2.5.3. Ping请求程序
Ping请求程序是一个发送Ping请求给目的地的程序,使用ICMP协议的消息协议并利用ping_request()函数。

ping_request()函数通过与DOS命令提示符的Ping程序相近的形式创建。该函数在分析和处理选项后发送Ping请求给目的地。

域名和IP地址都可以用作Ping请求的目的地址。如果使用域名,域名会通过gethostbyname()函数或DNS服务器转换成IP地址,随着IP地址的改变,Ping请求随之发送。

当使用’-a’选项使用IP地址时,域名可以通过gethostbyaddr()函数从DNS服务器获取,Ping请求会发送给该IP地址。当不适用’-a’ 选项使用IP地址时,Ping请求发送给输入的IP地址,而不与DNS服务器建立连接。

gethostbyname(), gethostbyaddr()是DNS的相关函数,想了解更多,请参考3.2.6.6 DNS 客户。<图3.8>和<图3.9>显示的是处理ping_request()的程序。

<图3.8>描述了如何标记输入命令和选项,以及如何创建选项值,如何决定参数标志位的相关位。

<图3.9>是基于相关选项调用ping()函数的,包含检测命令的有效性选项以及参数标志位的值选项。ping()函数发送Ping请求给信息给目的地,并处理从任意目的地接收到的ICMP消息。

<图3‑8: ping_request()函数>

<图3‑9: ping_request()函数——续>

让我们在进入Ping程序前简要的看一下Ping消息。

Ping消息在类型字段中具有’0’(Ping相应)或’8’(Ping请求)的值。ICMP消息的代码字段为’0’类型。具有依赖于4Bytes的ICMP消息的数据字段可以分别被重新定义成2 字节的ID字段和2Bytes的序列号字段。ICMP消息的数据字段填充了Ping数据且用于Loopback。

最后,Ping响应程序计算ICMP首部以及Ping数据的校验码,并用新的计算的值代替校验和为0的字段。

<图3.10>是ICMP报文格式和Ping消息之间的关系图。

检测Ping请求的响应可以通过检测ID的值、序列号与ping数据域是否相同来处理。如果Ping响应没有在等待时间内返回,ping请求重新发送,这种情况下,Ping请求发送的序列号递增1。

当ping()函数发送Ping请求消息并检测到Ping响应消息后,ping()的内容就包括目的IP地址、Ping响应等待时间和Ping请求数目。分析Ping数据大小并处理接收到的Ping响应找到适合的参数。

<图3.11>是ping()函数的处理过程,<表3-21>是Ping消息作为数据类型的定义和使用,参见”inet/ping.h”。

PINGMSG的数据字段大小是’PINGBUF_LEN’字节,定义PINGBUF_LEN为’32’。但是,数据字段最大可到’1472’,这是因为W5100发送的最大传输单元(MTU)是1480字节,代码总量、校验和、ID和序列号字段大小是8字节。如果我们从1480中减去8,我们就得到1472这个值,因此,字段大小为1472字节。

ping()函数的结果保存在数据类型中,定义在<表3-21>中。

保存的Ping日志可以通过DisplayPingStatistics()函数在RS232终端输出,<图3.12>所示为DisplayPingStatistics()函数的程序流程。

每当从远端主机没有正确接收Ping响应校验和时,CheckSumErr字段加1。

如果没有接收到消息或从远端主机或网关接收到超时消息,Unreachable MSG字段和TimeExceedMSG字段加1。

当接收到未知消息时,UnknownMSG字段加1。

每当从ARP请求获取远端之际物理地址(MAC地址)没有ARP响应时,ARPErr字段加1。

每当ping()函数发送Ping请求时,PingRequest字段加1。

每当从远端主机接收到Ping请求的响应时,PingReply字段加1。

每当因为发送Ping请求后,没有在特定时间内收到远端主机的响应时,Loss字段加1。

<图3‑11:ping()函数>

<图3‑12:DisplayPingStatistics()函数>

正如前面所说的,Ping请求程序是使用运行在IP协议之上的ICMP协议的程序。如果在W5100上使用ICMP信道,如<图3.11>和 <图3.13>所示,必须确定用来使用的IP协议,调用setIPProtocol(s, IPPROT_ICMP)后必须创建socket,创建socket过程中调用socket(s,SOCK_IPL_RAW,port,flag)时必须创建IP_RAW信道。如果关闭ICMP Socket,在调用close(s)函数清除先前设置的ICMP标志位后,需要调用setIPProtocol(s, 0x00)。

3.2.6. 应用程序
这是一个使用W5100的网络应用程序,包括Loopback程序、Web服务器和DHCP客户端,通过管理程序可以选择应用程序。

3.2.6.1. Loopback TCP服务器
将评估板的Loopback TCP服务器程序设置成服务器模式,测试电脑的AX1程序设置成客户模式。AX1尝试连接评估板,如果连接成功,AX1通过TCP信道传送数据流,评估板从AX1返回数据流,通过TCP信道,但不加处理。
Loopback TCP服务器程序使用Loopback _tcps()函数,<图3.14>所示为Loopback _tcps()函数的程序流程。

如果服务器socket处于SOCK_CLOSED状态,Loopback _tcps()函数通过SOCK_STREAM、监听端口号和选项标志位来创建TCP服务器socket去调用socket()函数。

不管socket先前的状态,socket()函数都可以将socket状态更改为SOCK_INIT。如果服务器socket创建成功,它可以将服务器socket作为参数调用listen()函数后运行在TCP服务器模式下。listen()函数设置服务器socket为SOCK_LISTEN状态,并且保持这个状态直到接收到任意客户端的连接请求。

这样,当有任何客户尝试连接服务器socket时,服务器的socket状态就从SOCK_LISTEN变成SOCK_ESTABLISHED。这就是当客户端和服务器成功建立连接后,就可以在SOCK_ESTABLISHED状态下进行数据传输。

当处于SOCK_ESTABLISHED状态下,使用recv()函数和send()函数进行数据传输,数据传输在评估板(服务器端) and AX1(客户端)采用一对一方式进行传输。

当处于SOCK_ESTABLISHED状态下,如果客户请求关闭连接,服务器端socket状态就从SOCK_ESTABLISHED变成SOCK_CLOSE_WAIT。当处于SOCK_CLOSE_WAIT状态下,数据通信不可用,而且必须关闭服务器端socket。当处于SOCK_CLOSE_WAIT状态下,会调用disconnect()函数关闭socket,无论先前socket是什么状态,disconnect()函数都会将socket状态改为SOCK_CLOSED。

3.2.6.2. Loopback TCP客户端
在Loopback TCP客户端程序中,评估板在客户模式下运行,AX1和电脑测试程序运行在服务器模式下。评估板尝试连接作为服务器等待的AX1,如果成功建立连接,评估板会通过TCP信道接收数据流,然后,评估板会发送接收到的数据给AX1。

Loopback TCP客户端程序通过Loopback_tcpc()函数创建,<表3.15>是Loopback_tcpc()函数的流程图。

如果客户端socket处于SOCK_CLOSED状态下,Loopback_tcpc()函数通过参数SOCK_STREAM、任意端口号和选项标志位调用socket()函数去创建TCP客户端socket。

这里在创建socket时,get_system_any_port()函数可以使用任意端口号,这是因为如果客户端使用同样的端口号尝试连接同一的服务器时,创建连接会失败。当socket创建成功后,就利用客户端的socket参数调用connect()函数连接AX1服务器。

connect()函数使socket进入SOCK_SYNSENT状态,并保持这个状态知道接收到服务器端的连接许可,如果连接成功,socket状态从SOCK_SYNSENT变成SOCK_ESTABLISHED。当处于SOCK_ESTABLISHED下,操作函数与之前的Loopback _tcps()函数是一样的。

 

这是本文的第四部分内容,后面的内容我们将会在今后的博文一一介绍,希望对大家有所帮助。欢迎大家的留言讨论。

 

更多有关W5100的博文请看这里:

http://blog.iwiznet.cn/?page_id=329

全硬件TCP/IP嵌入式以太网控制器——W5100E01-AVR http://blog.iwiznet.cn/?p=432

开源硬件-开源思潮到了? http://blog.iwiznet.cn/?p=316

WIZnet员工Richard培训笔记: WIZnet核心技术和产品对比 http://blog.iwiznet.cn/?p=29

 

也可进入我们的官方网站或博客查看更多。

如果您对WIZnet的产品或是技术感兴趣,请随时与我们联系。

可以直接留言或登录WIZnet官方网站:http://www.iwiznet.cn

公司微博是: http://weibo.com/wiznet2012

公司博客是:http://blog.iwiznet.cn/