这是官方文档中的例子代码,以此了解一下uip处理web server是怎么样的。
struct example5_state
{
char *dataptr;
unsigned int dataleft;
}
void example5_init(void)
{
uip_listen(HTONS(80));
uip_listen(HTONS(81));
}
void example5_app(void)
{
struct example5_state *s;
s = (struct example5_state)uip_conn->appstate;
if(uip_connected())
{
switch(uip_conn->lport)
{
case HTONS(80):
s->dataptr = data_port_80;
s->dataleft = datalen_port_80;
break;
case HTONS(81):
s->dataptr = data_port_81;
s->dataleft = datalen_port_81;
break;
}
uip_send(s->dataptr, s->dataleft);
return;
}
if(uip_acked())
{
if(s->dateleft < uip_mss())
{
uip_close();
return;
}
s->dataptr += uip_conn->len;
s->dataleft -= uip_conn->len;
uip_send(s->dataptr, s->dataleft);
}
结构体中含有要发送文件的地址和长度。初始化函数中分别监听80和81端口。app函数中根据端口值处理不同连接。这个app通过回应驱动即uip_asked(),如果发送文件长度小于uip_mss()中返回的长度,则表示文件发送完了,执行uip_close()。没有的话,调整文件指针和长度信息,继续通过uip_send()发送。