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/