金牌会员
- 积分
- 2441
- 金钱
- 2441
- 注册时间
- 2014-11-5
- 在线时间
- 348 小时
|
demo是从xiaoyan大神的帖子http://www.openedv.com/thread-25178-1-1.html下代码移植过去的。demo(裸机)实现的功能如下:
实现了开发板作为客服端与远程服务器进行tcp/ip协议简单收发数据
实现DHCP动态分配IP功能
实现DNS功能
实现enc28j60采用中断方式接收网口的数据
实现简单判断网线是否插上
在此抛砖引玉,向前辈们请教几个问题。
以下代码中,有标志问题1和问题2。
1.问题1处,和服务器断开链接后,怎么还会收到空的数据帧?
2.err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)函数是客户端接收到数据后调用,那么和服务器断开链接后,假设问题1出程序程序能执行,但还能执行到问题2处吗?
3.自己的应用程序和LWIP内核回调程序是怎样一个运行流程?
4.怎样测试网络速度的快慢呢?
[mw_shl_code=c,true]//客户端接收到数据之后将要调用的函数
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
err_t ret_err;
struct tcp_client_state* ts;
ts = arg; //TCP PCB状态
if(p==NULL) //如果从服务器接收到空的数据帧就关闭连接,???问题1
{
ts->state = ES_CLOSING; //连接关闭了
tcp_client_close(tpcb,ts);
lwip_flag &=~ LWIP_CONNECTED; //清除连接标志
printf("连接关闭了!1\r\n");
}
else if(err!=ERR_OK)
{ //位置错误释放pbuf
if(p!=NULL)
{
pbuf_free(p);
}
ret_err = err; //得到错误
}
else if(ts->state==ES_RECEIVED)
{ //连接收到了新的数据
revdatalen = p->tot_len;
if((p->tot_len)>=LWIP_DEMO_BUF)
{ //如果收的的数据大于缓存
((char*)p->payload)[LWIP_DEMO_BUF - 1] = 0;
memcpy(lwip_demo_buf,p->payload,LWIP_DEMO_BUF);
}
else
{
memcpy(lwip_demo_buf,p->payload,p->tot_len);
lwip_demo_buf[p->tot_len] = 0;
}
lwip_flag |= LWIP_NEW_DATA; //收到了新的数据
tcp_recved(tpcb, p->tot_len); //用于获取接收数据的长度, 表示可以获取更多的数据
pbuf_free(p); //释放内存
ret_err = ERR_OK;
}
else if(ts->state==ES_CLOSING) //???问题2
{ //服务器关闭了
tcp_recved(tpcb, p->tot_len); //远程端口关闭两次,垃圾数据
pbuf_free(p);
ret_err = ERR_OK;
printf("连接关闭了!2\r\n");
}
else
{ //其他未知状态
tcp_recved(tpcb, p->tot_len);
pbuf_free(p);
ret_err = ERR_OK;
}
return ret_err;
}[/mw_shl_code]
|
|