国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

【轉(zhuǎn)】Arduino官方WIFI模塊----開發(fā)記錄

發(fā)布時(shí)間:2012-12-24 08:59    發(fā)布者:coocox
關(guān)鍵詞: Arduino , WIFI , Cookie , Cox
WIFI開發(fā)計(jì)劃

CooCox Cedar@Wuhan


說明:
本來計(jì)劃開發(fā)SparkFun的WiFly模塊,后來發(fā)現(xiàn)Arduino官網(wǎng)出了WIFI模塊,就優(yōu)先開發(fā)Arduino WIFI Shield。

官方的WIFI Shield資料如下:
*:原理圖
*:PCB文件
*:WIFI庫
*:固件代碼(用于實(shí)現(xiàn)IP棧)
以上所有資料均可從Arduino官網(wǎng)下載,需要說明的是WIFI Shield的核心芯片是HDG104,進(jìn)入HD官網(wǎng)下載資料時(shí),

需要注冊賬戶,注冊后,不知為何,始終無法登陸,所有沒有下載到任何手冊。如果您有HDG104的手冊,可以分享
一下,非常感謝。

因?yàn)閾QWIFI模塊,需要重新熟悉代碼和資料,現(xiàn)制定一份初步計(jì)劃
計(jì)劃如下:


  階段1:  
學(xué)習(xí)Socket編程

難點(diǎn):開發(fā)環(huán)境的搭建,熟悉網(wǎng)絡(luò)概念


階段
2:
用Socket實(shí)現(xiàn)HTTP例子(客戶端和服務(wù)器)

難點(diǎn):HTTP協(xié)議分析和HTML代碼編寫


階段
3:
分析官方WIFI庫代碼

難點(diǎn):理解代碼的分層模型,從代碼中分析WIFI模塊的協(xié)議


階段
4:
移植到Cookie

難點(diǎn):Cox接口入門

                       
階段
5:
總結(jié)

總結(jié)心得體會(huì),分享資料,鏈接





PS:如果有任何疑問,請跟帖或email我,3Q
Email: renjun@coocox.com


Socket軟件包使用說明



綜述


本Socket軟件包作為Arduino WIFI shield入門指導(dǎo)中的一部分,用于說明如何在windows下用TCP/IP Socket編程,如何建立鏈接,綁定端口,收發(fā)數(shù)據(jù),深入理解這部分,更利于后期學(xué)習(xí)HTTP客戶端和服務(wù)器代碼。這里用Socket寫了一個(gè)簡單的局域網(wǎng)聊天工具,在不同的機(jī)器上分別運(yùn)行客戶端和服務(wù)器,然后就像QQ一樣聊天。


軟硬件環(huán)境


操作系統(tǒng): Win7
開發(fā)環(huán)境: VS2008
開發(fā)語言:C
注:所有代碼在上述環(huán)境中測試通過,理論上在其它環(huán)境(如VC++6.0,windows XP)可以編譯通過,但未測試


目錄結(jié)構(gòu)


使用時(shí)只需要重點(diǎn)關(guān)注紅色字體標(biāo)注的文件(夾)

Socket
│  
├─client
│  │  client.c                                   ------> Socket 客戶端源碼
│  │  
│  ├─client
│  │  │  client.ncb
│  │  │  client.sln
│  │  │  client.vcproj                           ------> Client VC工程文件
│  │  │  client.vcproj.RENJUN-PC.RENJUN.user
│  │  │  
│  │  └─Debug
│  │          BuildLog.htm
│  │          client.exe                         ------> VC工程生成的客戶端可執(zhí)行文件,在本
│  │                                                     機(jī)上可以直接雙擊運(yùn)行。如需在其它電腦運(yùn)行,
│  │                                                     請參考“發(fā)布”章節(jié)中的步驟和注意事項(xiàng)
│  │          client.exe.embed.manifest          ------> exe文件的依賴關(guān)系,詳細(xì)信息,參考“發(fā)布”章節(jié)
│  │          client.exe.embed.manifest.res
│  │          client.exe.intermediate.manifest
│  │          client.ilk
│  │          client.obj
│  │          client.pdb
│  │          mt.dep
│  │          vc90.idb
│  │          vc90.pdb
│  │         
│  └─dist                                        ------> 需要在其它沒裝VS2008的電腦上運(yùn)行exe文件時(shí),
│      │                                                 直接將dist文件夾復(fù)制過去就ok,
│      │                                                 詳細(xì)信息,參見“發(fā)布”章節(jié)
│      │  client.exe
│      │  client.exe.embed.manifest
│      │  
│      └─Microsoft.VC90.DebugCRT
│              Microsoft.VC90.DebugCRT.manifest
│              msvcm90d.dll
│              msvcp90d.dll
│              msvcr90d.dll
│              
└─server
    │  server.c                                  ------> Socket 服務(wù)器源碼
    │  
    ├─dist                                       ------> 需要在其它沒裝VS2008的電腦上運(yùn)行exe文件時(shí),
    │  │                                                 直接將dist文件夾復(fù)制過去就ok
    │  │                                                 詳細(xì)信息,參見“發(fā)布”章節(jié)
    │  │  server.exe
    │  │  server.exe.embed.manifest
    │  │  
    │  └─Microsoft.VC90.DebugCRT
    │          Microsoft.VC90.DebugCRT.manifest
    │          msvcm90d.dll
    │          msvcp90d.dll
    │          msvcr90d.dll
    │         
    └─server
        │  server.ncb
        │  server.sln
        │  server.vcproj                           ------> Server VC工程文件
        │  server.vcproj.RENJUN-PC.RENJUN.user
        │  
        └─Debug
                BuildLog.htm
                mt.dep
                server.exe                         ------> VC工程生成的客戶端可執(zhí)行文件,在本機(jī)上
                                                           可以直接雙擊運(yùn)行。如需在其它電腦運(yùn)行,
                                                           請參考“發(fā)布”章節(jié)中的步驟和注意事項(xiàng)
                server.exe.embed.manifest          ------> exe文件的依賴關(guān)系,詳細(xì)信息,參考“發(fā)布”章節(jié)
                server.exe.embed.manifest.res
                server.exe.intermediate.manifest
                server.ilk
                server.obj
                server.pdb
                vc90.idb
                vc90.pdb







使用方法


A:體驗(yàn)
1:雙擊打開server 目錄下exe文件夾下exe文件,啟動(dòng)聊天服務(wù)器
2:雙擊打開client 目錄下exe文件夾下exe文件,啟動(dòng)聊天客戶端
3:啟動(dòng)客戶端后,輸入服務(wù)器主機(jī)IP地址,便可開始聊天
4:根據(jù)提示進(jìn)行發(fā)送和接收信息,在發(fā)送狀態(tài)時(shí),如果不想發(fā)送數(shù)據(jù),可以按回車,取消發(fā)送

B:開發(fā)
1:確保您已經(jīng)正確安裝VS2008
     2:雙擊軟件包中的server.vcproj和client.vcproj,打開對應(yīng)的工程文件
     3:編譯和調(diào)試server和client代碼




發(fā)布



如果想要將生成的exe文件在其他電腦上運(yùn)行,只復(fù)制exe文件過去,打開時(shí),會(huì)出現(xiàn)下面的錯(cuò)誤


file:///C:/Users/RENJUN/AppData/Local/youdao/ynote/images/6286383C8E6B40F6B8A017F7F6E13A14/R%5DQEAS%257BW%40)%40%5B8QENKYFPA67.jpg




這是因?yàn)槿鄙賹?yīng)的dll,所以我們需要同時(shí)復(fù)制dll,exe和描述文件過去,別人才能正常運(yùn)行

這里以打包c(diǎn)lient為例,來說明如何正確發(fā)布軟件
1:新建一個(gè)文件夾,文件夾名字隨便起,這里我們將文件夾命名為dist,該文件夾用于存放exe文件和對應(yīng)的依賴文件
2:打開軟件包中Debug文件夾,找到 client .exe和 client .exe.embed.manifest文件
   如沒有這些文件,進(jìn)入VS2008,rebuild一下
3:打開 client.exe.embed.manifest文件,查看exe依賴的dll
   在我電腦上,client.exe.embed.manifest內(nèi)容如下:




  
   
      
        
      
   
  
  
   
      
   
  



文件組織方式為標(biāo)準(zhǔn)xml結(jié)構(gòu),在此重點(diǎn)關(guān)注部分(紅色字體)。可以得到如下信息:
  • 該exe為win32可執(zhí)行文件
  • 依賴Microsoft.VC90.DebugCRT目錄下的dll文件
  • dll版本號為:9.0.21022.8

知道缺少了哪些dll,只需要將這些dll復(fù)制到exe文件夾下即可


4:進(jìn)入VS2008安裝目錄,找到Microsoft.VC90.DebugCRT這個(gè)文件夾,在我的電腦上路徑如下:
   D:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86
   不同電腦,路徑可能不一樣,但大致結(jié)構(gòu)相同


5:將Microsoft.VC90.DebugCRT文件夾整體拷貝到第1步建立的dist文件夾中


6:現(xiàn)在所有的必須的文件都已經(jīng)復(fù)制完畢,dist文件夾下目錄組織結(jié)構(gòu)如下

dist
|-->client.exe
|-->client.exe.embed.manifest  
|---Microsoft.VC90.DebugCRT
      |---> Microsoft.VC90.DebugCRT.manifest
      |---> msvcm90d.dll
      |---> msvcp90d.dll
      |---> msvcr90d.dll




7:檢查dist目錄下client.exe.embed.manifest和Microsoft.VC90.DebugCRT.manifest版本號(9.0.21022.8)是否一致

8:現(xiàn)在您可以將dist文件夾打包,發(fā)送給朋友了 ^_^


軟件包下載




所有代碼可以從github網(wǎng)站下載:
https://github.com/cedar-renjun/Socket_server_client_chat_Example






Socket Http WebClient






說明:直接用Socket連接百度web服務(wù)器,然后發(fā)送HTTP Get請求來獲取百度首頁,VS2008工程在上個(gè)帖子中有鏈接,這次直接發(fā)代碼,使用時(shí),將代碼復(fù)制到.c文件中,rebuild生成exe文件,然后點(diǎn)擊運(yùn)行,就可以看到獲取的html網(wǎng)頁了

#include
#include
#include

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 80

WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
char *HttpRequst ="GET / HTTP/1.1\r\nConnection: close\r\n\r\n";
char RecvBuf[DEFAULT_BUFLEN];
char *IP = "119.75.217.56";
struct sockaddr_in ServerCfg;
char WelcomeInfo[] =
{
    "\t===============WIFI Shield Dirver================\r\n"
    "\tName: HTTP WebClient Example\r\n"
    "\tHOST : http://www.baidu.com\r\n"
    "\tIP   : 119.75.217.56\r\n"
    "\tPORT : 80\r\n"
    "\t=============== CooCox Team =====================\r\n"
};

int main(void)
{
    int tmp = 0;
    int cnt = 0;
    int iResult = 0;

    printf(WelcomeInfo);
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0)
        {
        printf("WSAStartup failed with error: %d\r\n", iResult);
        return 1;
    }
    printf("Initial WinSock OK\r\r\n");

    // Create a SOCKET for connecting to server
    ConnectSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (ConnectSocket  == INVALID_SOCKET)
    {
        printf("socket failed with error: %ld\r\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    printf("Create Socket OK\r\n");

    //Connect to Server
    ServerCfg.sin_family = AF_INET;
    ServerCfg.sin_port = htons(DEFAULT_PORT);
    ServerCfg.sin_addr.s_addr = inet_addr(IP);

    printf("Try to connect server\r\n");
    iResult = connect(ConnectSocket, (struct sockaddr *)&ServerCfg, sizeof(struct sockaddr));
    if (iResult == SOCKET_ERROR)
    {
        printf("Unable to connect to server!\n");
        WSACleanup();
        return 1;
    }
    printf("Connect to server!\r\n");   
    // Send Message to Server

    printf("Send HTTP Requst\r\n%s", HttpRequst);

    iResult = send( ConnectSocket, HttpRequst, strlen(HttpRequst), 0);
    if (iResult == SOCKET_ERROR)
    {
        printf("send failed with error: %d\r\n", WSAGetLastError());
    }

    printf("-----------Receive Respon Message---------\r\n");

    // Receive Full response message
    while(1)
    {
        // Important,MUST NOT comment this
        memset(RecvBuf, '\0', DEFAULT_BUFLEN);
        iResult = recv( ConnectSocket, RecvBuf, DEFAULT_BUFLEN, 0);
        if (iResult < 0)
        {
            printf("receive failed with error: %d\r\n", WSAGetLastError());
        }
        else if(iResult > 0)
        {
            puts(RecvBuf);
        }
        else
        {
            printf("\r\n----------------------------------------------");
            printf("\r\nReceive OK\r\n");
            break;
        }
    }

    // clean
    printf("Now Release resource\r\n");
    closesocket(ConnectSocket);
    WSACleanup();
    printf("Closed! Example is over\r\n");
    printf("Press Enter to exit\r\n");
    getch();
    //while(1);
}



Socket Http WebServer







#include
#include     // use Sleep function
#include
#include
#include

// Need to link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 2048
#define DEFAULT_PORT 27013

char RecvBuf[DEFAULT_BUFLEN];
char SendBuf[DEFAULT_BUFLEN];

struct sockaddr_in ServerCfg;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
char WelcomeInfo[] =
{   
    "\t===============WIFI Shield Dirver================\r\n"
        "\tName: TCP Socket Http Webserver Example\r\n"
        "\tPORT : 8080\r\n"
        "\t=============== CooCox Team =====================\r\n"
};

char RespondInfo[] =
{
    "HTTP/1.1 200 OK\r\n"   
        "Content-Type: text/html\r\n"
        "Connnection: close\r\n"
        "\r\n"
        "\r\n"
        "\r\n"   
        "\r\n"
        "

"
        "================= WIFI Shield Dirver===============
"
        "Name: TCP Socket Http Webserver Example
"
        "PORT : 27013
"
        "==================="
        "CooCox Team
=====================
"
        "

"
        "\r\n"
        "\r\n"
        "\r\n"
};

int main(void)
{
    WSADATA wsaData;
    int iResult = 0;
    int iSendResult = 0;
    printf(WelcomeInfo);
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0)
    {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }
    printf("Initial WinSock OK\r\n");

    // Create a SOCKET
    ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("socket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    printf("Create Socket OK\r\n");

    // Setup the TCP listening socket
    ServerCfg.sin_family = AF_INET;
    ServerCfg.sin_port = htons(DEFAULT_PORT);
    ServerCfg.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult = bind(ListenSocket,(struct sockaddr *)&ServerCfg,
            sizeof(struct sockaddr));
    if(iResult == SOCKET_ERROR)
    {
        printf("bind failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }   
    printf("Bind to PORT OK\r\n");

    // Begin listen PORT
    iResult = listen(ListenSocket, 5);
    if (iResult == SOCKET_ERROR)
    {
        printf("listen failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    printf("Start Listen PORT\r\n");
    printf("Waitting Client ...\r\n");

    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    printf("Client Connect Now\r\n");

    // No longer need server socket
    closesocket(ListenSocket);

    // Get Request

    // Receive Full response message

    printf("Receive Web bowser request\r\n");
    memset(RecvBuf, '\0', DEFAULT_BUFLEN);
    iResult = recv(ClientSocket, RecvBuf, DEFAULT_BUFLEN, 0);
    if (iResult < 0)
    {
        printf("receive failed with error: %d\r\n", WSAGetLastError());
    }
    else if(iResult > 0)
    {
        puts(RecvBuf);
    }
    else
    {
        printf("Connect Closed!\r\n");
    }

    // Send html to client
    //printf("Send HTTP Respond:\r\n%s\r\n",RespondInfo);
    iResult = send(ClientSocket, RespondInfo, strlen(RespondInfo), 0);
    if (iResult == SOCKET_ERROR)
    {
        printf("send failed with error: %d\r\n", WSAGetLastError());
    }
    printf("Send OK\r\n");
    //Wait 1S to allow boswer to receive information
    Sleep(1000);
    // shutdown the connection since no more data will be sent
    closesocket(ClientSocket);
    WSACleanup();
    printf("WebServer closed! Press Enter to exit\r\n");
    getch();
}


階段總結(jié)





WIFI模塊本身做不了什么,只有和TCP/IP協(xié)議棧,HTTP協(xié)議結(jié)合起來,才能發(fā)揮更大的作用。
從分層模型上來看,WIFI本身僅僅充當(dāng)物理層和數(shù)據(jù)鏈路層的作用,因?yàn)楦鲗拥慕涌谔匦裕蠈又恍枰P(guān)注下層提供的接口,無需關(guān)注內(nèi)部實(shí)現(xiàn),所以在保證接口不變的前提下,可以直接替換內(nèi)部模塊。一般開發(fā)時(shí),先在PC上調(diào)試好應(yīng)用層代碼,調(diào)試ok后,直接將底層代碼替換成WIFI驅(qū)動(dòng),這樣就可快速完成模塊。
所以下面的帖子會(huì)先介紹PC上常用的軟件和對應(yīng)的設(shè)置方法,然后用理論加實(shí)踐的方式介紹TCP/IP socket編程入門,HTTP協(xié)議分析和模擬客戶端,服務(wù)器。








本文地址:http://m.qingdxww.cn/thread-103327-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
coocox 發(fā)表于 2012-12-24 09:05:17
                                                                       精簡版inet_addr

說明:
今天在移植代碼的時(shí)候,需要一個(gè)客戶端WiFiClientConnect函數(shù),該函數(shù)的一個(gè)參數(shù)為服務(wù)器地址,第二個(gè)為端口。

其中服務(wù)器的地址可以是主機(jī)地址(如: www.baidu.com ),也可以是IP地址(如:192.168.2.71)。

官方的WIFI驅(qū)動(dòng)是C++重載函數(shù)寫的,可以根據(jù)不同的輸入格式來調(diào)用對應(yīng)的函數(shù),C中沒有重載,只有手工解析,解決方法有3個(gè):

1:分別采用2個(gè)函數(shù),比如提供WiFiClientConnectVia 和Host WiFiClientConnectViaIP兩個(gè)函數(shù),供用戶調(diào)用

2:像Arduino WiFi驅(qū)動(dòng)接口那樣,使用一個(gè)函數(shù),但增加一個(gè)入口參數(shù),用于指明服務(wù)器地址類型

3:符合Arduino 官方WIFI的調(diào)用習(xí)慣,用一個(gè)WiFiClientConnect函數(shù),用戶只需輸入HOST或IP即可,解析的問題,交給函數(shù)內(nèi)部來處理如 WiFiConnect( "www.baidu.com", 80);WiFiConnect( "192.168.2.71", 80)

最終為了方便用戶,采用了最后一個(gè)方案,這樣用戶可以更加方便的使用WIFI

我們需要在內(nèi)部識別出是否是有效的IP地址,如果是的話,則轉(zhuǎn)換為網(wǎng)絡(luò)地址,這樣就需要一個(gè)識別和轉(zhuǎn)換函數(shù)IPToNetAddr。

IPToNetAddr將傳入的IP地址解析成網(wǎng)絡(luò)格式,比如將“192.168.2.71”分割成4個(gè)10進(jìn)制的數(shù)字,存到數(shù)組里面

在Q群問了網(wǎng)友,有人說inet_addr符合要求,找到對應(yīng)源碼后,發(fā)現(xiàn)它考慮的情況太多了,支持各種進(jìn)制的數(shù)字,而我們這里,只需要支持10進(jìn)制就ok,網(wǎng)上搜了一下,貌似沒人寫過這函數(shù),所以還是自己動(dòng)手寫一個(gè)吧


要求:

1:能識別出輸入IP字符串是否有效,有效則返回0,無效則返回-1
2:輸入錯(cuò)誤的IP地址,函數(shù)不損壞存放結(jié)果的數(shù)組

錯(cuò)誤的IP例子:
1:子項(xiàng)過大:每個(gè)子項(xiàng)應(yīng)小于255。下面的IP地址第一個(gè)子項(xiàng)為1921,大于255
    1921.108.2.71
2:子項(xiàng)過多:應(yīng)有4個(gè)子項(xiàng),由3個(gè).號分隔,下面的IP地址有5個(gè)子項(xiàng)
    192.168.2.1.2


測試代碼如下:



int main(void)
{
    int retv = 0;

    //目標(biāo)IP地址字符串
    char IP_OK[] = "192.168.002.071";
    char IP_ERROR_1[] = "1921.108.2.71";
    char IP_ERROR_2[] = "192.168.2.1.2";
    char IP_ERROR_3[] = "293.168.2.1.2";
    char IP_ERROR_4[] = "193.168.2.1.300";

    //存儲(chǔ)結(jié)果數(shù)組
    uint8_t result[4] = {0, 0, 0, 0};

    retv = IPToNetAddr(IP_OK, result);   
    if(-1 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_1, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_2, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_3, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_3, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    printf("Test OK, Press any key to exit\r\n");
    getchar();
   
    return (0);
}




完整代碼如下:

CODE:

#include "stdafx.h"
#include
#include
//#include
#include

typedef unsigned char uint8_t;
typedef signed   char int8_t;

typedef unsigned int  uint32_t;
typedef signed   int  int32_t;

int IPToNetAddr(char * IPStr, uint8_t * NetAddr);

int main(void)
{
    int retv = 0;

    //目標(biāo)IP地址字符串
    char IP_OK[] = "192.168.002.071";
    char IP_ERROR_1[] = "1921.108.2.71";
    char IP_ERROR_2[] = "192.168.2.1.2";
    char IP_ERROR_3[] = "293.168.2.1.2";
    char IP_ERROR_4[] = "193.168.2.1.300";

    //存儲(chǔ)結(jié)果數(shù)組
    uint8_t result[4] = {0, 0, 0, 0};

    retv = IPToNetAddr(IP_OK, result);   
    if(-1 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_1, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_2, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_3, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    retv = IPToNetAddr(IP_ERROR_4, result);   
    if(0 == retv)
    {
        printf("Test Failure\r\n");
        while(1);
    }

    printf("Test OK, Press any key to exit\r\n");
    getchar();
   
    return (0);
}

int IPToNetAddr(char * IPStr, uint8_t * NetAddr)
{
    uint32_t _IP[4] = {0, 0, 0, 0};
    uint8_t cnt = 0;
    uint8_t idx = 0;
    char _str = NULL;
   
    //檢查IP和接收緩存區(qū)是否有效
    if(IPStr == NULL || NetAddr == NULL)
    {
        return (-1);
    }

    while((_str = *IPStr++) != NULL)
    {
        if(_str == '.')
        {
            //清空計(jì)數(shù)器,該計(jì)數(shù)器最大值為3
            cnt = 0;            
            if(_IP[idx] > 255)
            {
                return (-1);
            }
            idx = idx + 1;
        }
        else if(_str >= '0' && _str <= '9')  //檢查是否為有效字符 '0' --> '9'
        {            
            if(cnt++ < 3 && idx <= 3)
            {
                _IP[idx] = (10 * _IP[idx]) + (_str - '0');
            }
            else
            {
                return (-1);
            }
        }
        else
        {
            return (-1);
        }
    }

    if(_IP[idx] > 255)
    {
        return (-1);
    }

    //復(fù)制數(shù)據(jù)到結(jié)果緩存區(qū)
    NetAddr[0] = (uint8_t)_IP[0];
    NetAddr[1] = (uint8_t)_IP[1];
    NetAddr[2] = (uint8_t)_IP[2];
    NetAddr[3] = (uint8_t)_IP[3];

    return (0);
}
jlddzeec 發(fā)表于 2018-10-23 09:50:12
學(xué)習(xí)學(xué)習(xí)!
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 無線充電基礎(chǔ)知識及應(yīng)用培訓(xùn)教程
  • FPGA設(shè)計(jì)流程培訓(xùn)教程
  • Chiptorials ——如何將CryptoAuthLib庫用于Microchip安全身份驗(yàn)證IC
  • Chiptorials ——使用ATECC608 TrustFLEX實(shí)現(xiàn)基本非對稱身份驗(yàn)證
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91香蕉在线| 国产日韩在线观看视频网站 | 中文字幕曰韩一区二区不卡 | 日日噜噜夜夜狠狠视频 | 亚洲黄色片网站 | 免费视频网站在线观看黄 | 在线免费观看黄 | 精品国产福利一区二区在线 | 亚洲欧美日本另类 | 久久精品高清 | 亚洲一区二区三区免费 | 免费一级毛片能看的 | 噜噜噜网站 | 欧美视频在线观看一区二区 | 麻豆精品视频在线原创 | 日本 亚洲 欧美 | 日韩黄a级成人毛片 | 9久9久女女热精品视频免费观看 | 亚洲影视在线 | 成人精品视频一区二区在线 | 国产亚洲三级 | 欧洲在线观看在线视频吗 | 国产卡一卡二卡3卡4卡无卡视频 | 日韩在线看免费高清完整版 | 99re热这里只有精品66 | 国产精品久久久久久久久 | 欧美国产成人在线 | 91极品哺乳期女神挤奶在线 | 国产精品一区二区av | 麻豆精品在线播放 | 亚洲精品国产精品国自产 | 国产精品国产精品国产专区不卡 | 四虎国产精品免费久久影院 | 免费在线看黄色的网站 | 67194最新网址 | 国产极品在线观看 | 幻女free性zozo仙踪林 | 碰碰碰人人澡人人爱摸 | 欧美亚洲一区二区三区四 | 欧美久操| 成人精品视频一区二区在线 |