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

发布者:自在自由最新更新时间:2015-09-18 来源: eefocus关键字:uip  代码分析  c语言问题 手机看文章 扫描二维码
随时随地手机看文章
在进一步看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);   
}

100.jpg

这样就不难理解,index_html_data打印的数据,因为他是通过改变地址来改变的数据。

延伸拓展

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

关键字:uip  代码分析  c语言问题 引用地址:学习uip代码分析时遇到的c语言问题

上一篇:单片机c语言中菜单系统源码分析
下一篇:c语言结构体定义结构体

推荐阅读最新更新时间:2024-03-16 14:32

S3C2440A.s——2440启动代码中文详细分析
ARM启动代码相当于我们电脑的BIOS,也就是ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般包括:中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。这几天对着RealView MDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A的硬件有了一个大致的了解。学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A内部结构的了解。 把MDK自带的S3C2440A.S文件的注释发一下,这些是
[单片机]
STM32快速组织代码分析例如IO端口初始化GPIO_Init(GPIOE, &GPIO_InitStructure)
GPIO_Init(GPIOE, &GPIO_InitStructure); 函数实体定义是: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) //结构体的指针,指向结构体变量的首地址2020.2.18 //疑问?为什么用结构体指针类型定义,而不用结构体类型定义GPIOx, 对应的外设的内部地址单片机第一好的 对应自定义的结构体指针变量的地址,编译器自动分配识别地址 //GPIO_InitStruct2020.2.19
[单片机]
STM32库函数之GPIO初始化代码分析
首先我们先看GPIO的寄存器有哪些 1. 端口低配置寄存器 复位值:0x4444 4444 2.端口高配置寄存器 复位值:0x4444 4444 3.端口输入数据寄存器 复位值:0x0000 XXXX 4.端口输出数据寄存器 复位值: 0x0000 0000 5.端口位设置/清除寄存器 复位值: 0x0000 0000 6:端口位清除寄存器 复位值:0x0000 0000 7:端口配置锁定寄存器 复位值: 0x0000 0000 偏移地址从0x00一次加四到0x18 因为是32位寄存器,
[单片机]
LPC1768 eCos 启动代码分析(1)系统复位
要了解eCos的CortexM启动代码,需要理清下面几个文件的编译和链接关系。 packages/hal/cortexm/arch/current/src/vector.S packages/hal/cortexm/arch/current/src/hal_misc.c packageshalcortexmlpc17xxlpc1766stkcurrentincludepkgconfmlt_cortexm_lpc1766_rom.ldi mlt_cortexm_lpc1766_rom.ldi: // eCos memory layout #include pkgconf/hal.h #include cyg/infra/
[单片机]
ARM启动代码分析-philips的LPC2xxx系列
********************************************************************************************** *File: startup.s *Author: Embest w.h.xie 2005.02.21 *Desc: lpc22xx\lpc212x\lpc211x\lpc210x startup co de *History: * note modify: cui jian jie 2006-4-25 *comment: ***********************************
[单片机]
学习笔记--- S3C2440 对NANDFLASH操作原理与测试代码分析
首先来看一下NANDFLASH接口: 图上看出只有数据口和控制口,没有地址线,所以它不能像网卡,SDRAM那样统一寻址,它的操作方法步骤: 1 使能芯片 2 发操作指令(读,写,擦,复位) 3 发操作地址 5 等待忙信号释放(只有读) 6 发送数据(写),接收数据(读) 7 等待忙信号,低电平忙 8 禁能芯片 这些控制信号线都是通过软件设置寄存器,然后硬件自动产生其他控制线的控制信号; 操作信号含义如下: R/B :读/忙状态线 CE : 片选 CLE :发送指令信号 ALE :发送地址信号 WE:写信号 RE:读信号 这里要注意的: 1 数据按字节传输,刚好8位
[单片机]
学习笔记--- S3C2440 对NANDFLASH操作原理与测试<font color='red'>代码</font><font color='red'>分析</font>
u-boot移植(四)---修改前工作:代码流程分析3---代码重定位
一、重定位     1.以前版本的重定位        2.新版本          我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址。我们要修改地址,则必须知道程序的地址,就需要在链接的时候加上PIE选项:          加上PIE选项后,链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):          然后我们根据这些地址的信息来修改代码,程序就可以复制到SDRAM的任何地方去。 二、代码流程   start.S中执行到了 bl _main,跳转到_main,_main函数入口在crt0.S (ar
[单片机]
u-boot移植(四)---修改前工作:<font color='red'>代码</font>流程<font color='red'>分析</font>3---<font color='red'>代码</font>重定位
分析TCP/IP协议栈代码之IP & ICMP(STM32平台)
1. IP介绍 IP是TCP/IP协议族中最为核心的协议。大家,如TCP、UDP、ICMP及IGMP数据,都是在IP数据报格式基础上再封装一层再来传输的(见图1 - 4)。 不可靠(unreliable)的意思是它不能保证 IP数据报能成功地到达目的地。 IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP) 。 无连接(connectionless)这个术语的意思是I P并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。
[单片机]
<font color='red'>分析</font>TCP/IP协议栈<font color='red'>代码</font>之IP & ICMP(STM32平台)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved