新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 學(xué)習(xí)uip代碼分析時(shí)遇到的c語(yǔ)言問(wèn)題

        學(xué)習(xí)uip代碼分析時(shí)遇到的c語(yǔ)言問(wèn)題

        作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
        在進(jìn)一步看uip的代碼時(shí),遇到了一個(gè)問(wèn)題,可能是自己C語(yǔ)言知識(shí)不夠扎實(shí),特此總結(jié)一下

        以下是http協(xié)議處理輸入數(shù)據(jù)并更新頁(yè)面顯示的代碼

        本文引用地址:http://www.104case.com/article/201611/322300.htm

        static PT_THREAD(handle_input(struct httpd_state *s))
        {
        char *strx;
        u8 dbuf[17];
        PSOCK_BEGIN(&s->sin);
        PSOCK_READTO(&s->sin, ISO_space);
        if(strncmp(s->inputbuf, http_get, 4)!=0)PSOCK_CLOSE_EXIT(&s->sin); //比較客戶端瀏覽器輸入的指令是否是申請(qǐng)WEB指令 “GET ”
        PSOCK_READTO(&s->sin, ISO_space); //" "
        if(s->inputbuf[0] != ISO_slash)PSOCK_CLOSE_EXIT(&s->sin); //判斷第一個(gè)(去掉IP地址之后)數(shù)據(jù),是否是"/"
        if(s->inputbuf[1] == ISO_space||s->inputbuf[1] == ?) //第二個(gè)數(shù)據(jù)是空格/問(wèn)號(hào)
        {
        if(s->inputbuf[1]==?&&s->inputbuf[6]==0x31)//LED1
        {
        LED0=!LED0;
        strx=strstr((const char*)(data_index_html+13),"LED0狀態(tài)");
        if(strx)//存在"LED0狀態(tài)"這個(gè)字符串
        {
        strx=strstr((const char*)strx,"color:#");//找到"color:#"字符串
        if(LED0)//LED0滅
        {
        strncpy(strx+7,"5B5B5B",6); //灰色
        strncpy(strx+24,"滅",2); //滅
        strx=strstr((const char*)strx,"http:");//找到"http:"字符串
        strncpy(strx,(const char*)LED_OFF_PIC_ADDR,strlen((const char*)LED_OFF_PIC_ADDR));//LED0滅圖片
        }else
        {
        strncpy(strx+7,"FF0000",6); //紅色
        strncpy(strx+24,"亮",2); //"亮"
        strx=strstr((const char*)strx,"http:");//找到"http:"字符串
        strncpy(strx,(const char*)LED0_ON_PIC_ADDR,strlen((const char*)LED0_ON_PIC_ADDR));//LED0亮圖片
        }
        }
        }else if(s->inputbuf[1]==?&&s->inputbuf[6]==0x32)//LED2
        {
        LED1=!LED1;
        strx=strstr((const char*)(data_index_html+13),"LED1狀態(tài)");
        if(strx)//存在"LED1狀態(tài)"這個(gè)字符串
        {
        strx=strstr((const char*)strx,"color:#");//找到"color:#"字符串
        if(LED1)//LED1滅
        {
        strncpy(strx+7,"5B5B5B",6); //灰色
        strncpy(strx+24,"滅",2); //滅
        strx=strstr((const char*)strx,"http:");//找到"http:"字符串
        strncpy(strx,(const char*)LED_OFF_PIC_ADDR,strlen((const char*)LED_OFF_PIC_ADDR));//LED1滅圖片
        }else
        {
        strncpy(strx+7,"00FF00",6); //綠色
        strncpy(strx+24,"亮",2); //"亮"
        strx=strstr((const char*)strx,"http:");//找到"http:"字符串
        strncpy(strx,(const char*)LED1_ON_PIC_ADDR,strlen((const char*)LED1_ON_PIC_ADDR));//LED1亮圖片
        }
        }
        }
        strx=strstr((const char*)(data_index_html+13),"℃");//找到"℃"字符
        if(strx)
        {
        get_temperature(dbuf); //得到溫度
        strncpy(strx-4,(const char*)dbuf,4); //更新溫度
        }
        strx=strstr((const char*)strx,"RTC時(shí)間:");//找到"RTC時(shí)間:"字符
        if(strx)
        {
        get_time(dbuf); //得到時(shí)間
        strncpy(strx+33,(const char*)dbuf,16); //更新時(shí)間
        }
        strncpy(s->filename, http_index_html, sizeof(s->filename));
        }else //如果不是 /?
        {
        s->inputbuf[PSOCK_DATALEN(&s->sin)-1] = 0;
        strncpy(s->filename,&s->inputbuf[0],sizeof(s->filename));
        }
        s->state = STATE_OUTPUT;
        while(1)
        {
        PSOCK_READTO(&s->sin, ISO_nl);
        if(strncmp(s->inputbuf, http_referer, 8) == 0)
        {
        s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;
        }
        }
        PSOCK_END(&s->sin);
        }
        這部分代碼中,是處理輸入數(shù)據(jù)的,比如接收到的數(shù)據(jù)是把LED0滅掉,會(huì)更新網(wǎng)頁(yè)顯示的圖片使其變成灰色,并顯示“滅”字,同時(shí)更新時(shí)間和溫度。那我想問(wèn)了strx=strstr((const char*)(data_index_html+13),"℃");//在數(shù)組里找到"℃"字符后,又調(diào)用strncpy(strx-4,(const char*)dbuf,4); 我知道是把dbuf里的數(shù)據(jù)copy到strx-4的地址里邊去了,但怎么會(huì)更新到data_index_html[]里邊去的呢?這樣是怎么實(shí)現(xiàn)網(wǎng)頁(yè)顯示更新呢?后來(lái)也沒(méi)有出現(xiàn)strx啊?是不是應(yīng)該有strcpy(data_index_html,str,sizeof())這樣的語(yǔ)句?

        實(shí)際上,這是c語(yǔ)言的指針地址的關(guān)系。

        int *p;//定義一個(gè)指針P

        int a=10;//定義一個(gè)變量a賦初值10

        p=&a;//&是求地址運(yùn)算符 將a的地址賦給p p指向a的首地址,如果p指向數(shù)組 那么p就是數(shù)組的首地址strx=&data_index_html;

        *p=20;//那么*p就是a

        printf("%s",a);打印輸出20.

        P是指針,那么*p就是內(nèi)容。

        下面看vc打印

        int main()
        {

        char *strx;

        unsigned char data_index_html[]={"1234567890abcdefg"};

        strx=strstr((const char*)(data_index_html+2),"a"); //尋找a出現(xiàn)在data_index_html的位置 并返回其首地址
        printf("%s",strx);//打印data_index_html的首地址 并以流形式 輸出知道遇到

        主站蜘蛛池模板: 抚远县| 延安市| 育儿| 仙游县| 丰城市| 正定县| 来宾市| 丰宁| 禄丰县| 咸宁市| 嘉义县| 内江市| 渭源县| 宁夏| 广南县| 禄劝| 娱乐| 河西区| 无锡市| 邯郸市| 大港区| 宕昌县| 公安县| 七台河市| 永吉县| 桓仁| 靖安县| 岳普湖县| 保山市| 曲周县| 浦县| 阜康市| 靖安县| 织金县| 兴海县| 沽源县| 阳原县| 鹤岗市| 东阿县| 自治县| 洛隆县|