您的位置 首页 电源

学习uip代码剖析时遇到的c言语问题

在进一步看uip的代码时,遇到了一个问题,可能是自己C语言知识不够扎实,特此总结一下以下是http协议处理输入数据并更新页面显示的代码stat

在进一步看uip的代码时,遇到了一个问题,可能是自己C言语常识不行厚实,特此总结一下

以下是http协议处理输入数据并更新页面显现的代码

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); //比较客户端浏览器输入的指令是否是请求WEB指令 “GET ”
PSOCK_READTO(&s->sin, ISO_space); //” “
if(s->inputbuf[0] != ISO_slash)PSOCK_CLOSE_EXIT(&s->sin); //判别第一个(去掉IP地址之后)数据,是否是”/”
if(s->inputbuf[1] == ISO_space||s->inputbuf[1] == ?) //第二个数据是空格/问号
{
if(s->inputbuf[1]==?&&s->inputbuf[6]==0x31)//LED1
{
LED0=!LED0;
strx=strstr((const char*)(data_index_html+13),”LED0状况”);
if(strx)//存在”LED0状况”这个字符串
{
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状况”);
if(strx)//存在”LED1状况”这个字符串
{
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时刻:”);//找到”RTC时刻:”字符
if(strx)
{
get_time(dbuf); //得到时刻
strncpy(strx+33,(const char*)dbuf,16); //更新时刻
}
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);
}
这部分代码中,是处理输入数据的,比方接收到的数据是把LED0灭掉,会更新网页显现的图片使其变成灰色,并显现“灭”字,一起更新时刻和温度。那我想问了strx=strstr((const char*)(data_index_html+13),”℃”);//在数组里找到”℃”字符后,又调用strncpy(strx-4,(const char*)dbuf,4); 我知道是把dbuf里的数据copy到strx-4的地址里面去了,但怎样会更新到data_index_html[]里面去的呢?这样是怎样完成网页显现更新呢?后来也没有呈现strx啊?是不是应该有strcpy(data_index_html,str,sizeof())这样的句子?

实际上,这是c言语的指针地址的联系。

int *p;//界说一个指针P

int a=10;//界说一个变量a赋初值10

p=&a;//&是求地址运算符 将a的地址赋给p p指向a的首地址,假如p指向数组 那么p便是数组的首地址strx=&data_index_html;

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

printf(“%s”,a);打印输出20.

P是指针,那么*p便是内容。

下面看vc打印

int main()
{

char *strx;

unsigned char data_index_html[]={“1234567890abcdefg”};

strx=strstr((const char*)(data_index_html+2),”a”); //寻觅a呈现在data_index_html的方位 并回来其首地址
printf(“%s”,strx);//打印data_index_html的首地址 并以流方式 输出知道遇到完毕
printf(“%c”,*strx);//打印内容 只打印一个首地址地点的内容
printf(“%c”,*strx+1);
printf(“%c”,*strx+2);
if(strx)
{
strncpy(strx+2,”MY”,2);

}
printf(“%s”,data_index_html);
}

这样就不难理解,index_html_data打印的数据,由于他是经过改动地址来改动的数据。

延伸拓宽

在c言语中,strstr()函数回来便是地址。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/257200.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部