在进一步看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()函数回来便是地址。