网友 yuppie->硬件 提出来的问题:
void httpd_thread(void*arg)
{
struct netconn *conn,*newconn;
conn=netconn_new(NETCONN_TCP);/*创建新的连接标识*/
netconn_bind(conn,NULL,80);/*绑定到80号端口*/
netconn_listen(conn);/*开始监听端口*/
while(1){
newconn=netconn_accept(conn);/*建立连接*/
if(newconn!=NULL){
struct netbuf *buf;
char *rq;
u16_t len;
/*接收数据*/
while((buf=netconn_recv(newconn))!=NULL){
do{
netbuf_data(buf,&(void*)rq,&len);
}while(netbuf_next(buf)>=0);
netbuf_delete(buf);
}
if(rq[0]=='G'&&rq[1]=='E'&&rq[2]=='T')
{
netconn_write(newconn,(void*)http_html_hdr,sizeof(http_html_hdr),NETCONN_NOCOPY);
/*发送静态网页数据*/
netconn_write(newconn,(void*)indexdata,sizeof(indexdata),NETCONN_NOCOPY);
netconn_close(newconn);
}
netconn_delete(newconn);/*释放本次连接*/
}
}
}
对于你以上的代码,整体的过程是思路还算是明确,但是就你给我发的邮件来看,我发现存在以下几点问题,希望你能看看,是否是这里出错:
对于你提出来,说是程序可以ping通,这只能说明你的程序已经响应了ICMP协议,整体LWIP的程序可以正常的运行,你的以太网驱动都没有问题,而HTTP网页却不能打开,问题就是出现在这里。
我希望你能看看HTTP协议,仔细研究一下其工作的过程。对于你以后写这部分的代码有好处。
你给我的邮件main.c文件我已经看过了。
之前我先不谈论你的代码是否有问题,你在接收到主机发送的GET头关键字的时候,你作为从机相应的就不对,按照HTTP的协议,你应该返回的是:
HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n
对于这个语句的意思,你看看文档就知道了。而你仅仅返回的是 Content-type: text/html\r\n\r\n
也许HTTP/1.1 200 OK\r\n这个你在别的地方给发回主机,但是至少你给我的程序里面,我没能看到,希望你仔细核查一下。
在就是你使用指针存储数据的时候,记得最好是分配一下内存malloc一下,要么你就定义一下buffer 免得编译器自动给你分配,到时候程序跑飞也说不定哦。
剩下就是你发的HTML数据了,这里我就不给你检查你写的正确与否了。你自己看看html语言,检查一下看看写的对不对,你也可以把你的那个代码另存为一个*.html的文件,看看浏览器能否打开,这样是最快也最有效的检查。
看了上面的这个,你自己在好好看看你的程序吧。有什么问题,可以直接留言,也可以给我发e_mail。等过段时间我有空了,我把我的源代码给大家共享出来!