原创 W5100E01-AVR是什么?怎么用?(四)(用户手册V1.0版)

2012-8-24 09:59 1076 24 24 分类: 消费电子

 

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

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

http://blog.iwiznet.cn/?p=663

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

http://blog.iwiznet.cn/?p=696

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

http://blog.iwiznet.cn/?p=719

 

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> and <图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报文的代码字段可以分别被重新定义成2 Bytes的ID字段和2 Bytes的序列号字段,具有依赖于4 Bytes 的ICMP报文的0类型数据字段。ICMP报文的数据字段填充了Ping数据且用于Loopback 。

       最后,Ping响应程序计算ICMP信息头以及校验字段为0的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’ Byte,定义PINGBUF_LEN为‘32’。但是,数据字段最大可到‘1472’,这是因为W5100发送的最大传输单元(MTU)是1480 bytes,代码总量、校验码ID和序列号字段大小是8 Bytes。如果我们从1480中减去8,我们就得到1472这个值,因此,字段大小为1472 bytes。

       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,创建socke过程中调用socket(s,SOCK_IPL_RAW,port,flag)时必须创建IP_RAW信道。如果关闭ICMP套接字,在调调用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,如果成功建立连接,评估板会通过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/

文章评论0条评论)

登录后参与讨论
我要评论
0
24
关闭 站长推荐上一条 /2 下一条