OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16510|回复: 4

lwip 客户端用哪个函数可以判断网络连接的状态

[复制链接]

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-3-25
在线时间
9 小时
发表于 2014-3-25 14:39:44 | 显示全部楼层 |阅读模式
下面是我的程序,能实现收发功能了。但是前提必须是我先把服务器打开,再运行程序才能连接上服务器进行传输。如果我先运行程序,再打开服务器就连不上了。
因此我想问一下我在main里的循环程序里,怎么判断网络连接还在不在,不在的话我怎么重新连接?
void tcp_client_init(void)
{
uint16_t ei;
IP4_ADDR(&ipaddr, 192, 168, 100, 174); //????
tpcb = tcp_new();
TPCD = tpcb;
if(tpcb != NULL)
{
ei = tcp_bind(tpcb, IP_ADDR_ANY, 3000);
if(ei == ERR_OK)
{
   tcp_connect(tpcb, &ipaddr, 3000, tcp_client_accept);
}
}
}
err_t tcp_client_accept(void *arg, struct tcp_pcb *tpcb, err_t err)
{
tcp_recv(tpcb, tcp_client_recv);
return ERR_OK; 
}

//TCP的接收函数
static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
uint8_t Data_len;
tcp_recved(tpcb, p->tot_len); //接收到的数据存在了  p->payload地址下
Data_len = p->len;
tcp_write(tpcb,p->payload,Data_len,1);   //接收到的数据回传
pbuf_free(p); //把接收缓冲区清空
return ERR_OK;
}

uint16_t tcp_ei;
int main(void)
{

  /* Configure ethernet (GPIOs, clocks, MAC, DMA) */ 
  ETH_BSP_Config();
    
  /* Initilaize the LwIP stack */
  LwIP_Init();
      
    tcp_client_init();

  /* Infinite loop */
    while (1)
    {  
/* check if any packet received 下面几条语句以后放到任务里?任务切换要及时?*/
if (ETH_CheckFrameReceived())
 /* process received ethernet packet */
 LwIP_Pkt_Handle();
}
/* handle periodic timers for LwIP */
LwIP_Periodic_Handle(LocalTime);
    }   
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-3-25
在线时间
9 小时
 楼主| 发表于 2014-3-25 15:15:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-25 15:21:35 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

93

主题

745

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1843
金钱
1843
注册时间
2012-9-16
在线时间
285 小时
发表于 2014-3-25 15:59:52 | 显示全部楼层
switch (pcb->state) {  
  case CLOSED:  
    /* Closing a pcb in the CLOSED state might seem erroneous, 
     * however, it is in this state once allocated and as yet unused 
     * and the user needs some way to free it should the need arise. 
     * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) 
     * or for a pcb that has been used and then entered the CLOSED state  
     * is erroneous, but this should never happen as the pcb has in those cases 
     * been freed, and so any remaining handles are bogus. */  
  
    /*在CLOSED状态下关闭一个pcb似乎是错误的, 
     *尽管如此,一但在这个状态下分配了而且还没有使用所以用户需要一些办法来释放它 
     *调用一个已经被关闭的pcb的tcp_close(),(即2次)或者一个已经被使用了之后,进入CLOSE状态是错误的 
     *但作为一个在这些情况下被释放的pcb是不会存在的,因此,任何剩余的句柄都是假的 
     */  
    err = ERR_OK;//设定返回值  
    TCP_RMV(&tcp_bound_pcbs, pcb);//从绑定的pcb列表中去掉pcb  
    memp_free(MEMP_TCP_PCB, pcb);//在MEMP_TCP_PCB内存池设定释放掉的pcb对应的单元值,释放内存  
    pcb = NULL; //设置pcb指针指向空  
    break;  
  case LISTEN:  
    err = ERR_OK;//设定返回值  
    tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);//在tcp CB监听列表中删除对应的pcb  
    memp_free(MEMP_TCP_PCB_LISTEN, pcb);//在MEMP_TCP_PCB_LISTEN对应的内存池中设定需要释放的pcb单元值  
    pcb = NULL;//设置pcb指针指向空  
    break;  
  case SYN_SENT:  
    err = ERR_OK;//设定返回值  
    tcp_pcb_remove(&tcp_active_pcbs, pcb);//在所有accept或者send数据状态的TCP CB列表的TCP CB列表中删除对应的pcb  
    memp_free(MEMP_TCP_PCB, pcb);//在MEMP_TCP_PCB内存池设定释放掉的pcb对应的单元值,释放内存  
    pcb = NULL;//设置pcb指针指向空  
    snmp_inc_tcpattemptfails();//tcp尝试失败  
    break;  
  case SYN_RCVD:  
    err = tcp_send_ctrl(pcb, TCP_FIN);//通过pcb发送对应的TCP_FIN包,表示已完成  
    if (err == ERR_OK) { //如果发回ERR_OK表明发送成功  
      snmp_inc_tcpattemptfails();//tcp 尝试失败  
      pcb->state = FIN_WAIT_1; //pcb进入FIN_WAIT_1状态  
    }  
    break;  
  case ESTABLISHED:  
    err = tcp_send_ctrl(pcb, TCP_FIN);//通过pcb发送对应的TCP_FIN包,表示已完成  
    if (err == ERR_OK) {//如果发回ERR_OK表明发送成功  
      snmp_inc_tcpestabresets();//tcp 建立连接复位  
      pcb->state = FIN_WAIT_1; //pcb进入FIN_WAIT_1状态  
    }  
    break;  
  case CLOSE_WAIT:  
    err = tcp_send_ctrl(pcb, TCP_FIN);//通过pcb发送对应的TCP_FIN包,表示已完成  
    if (err == ERR_OK) {//如果发回ERR_OK表明发送成功  
      snmp_inc_tcpestabresets();//tcp 建立连接复位  
      pcb->state = LAST_ACK;//pcb进入LAST_ACK状态  
    }  
    break;  
  default:  
    /* Has already been closed, do nothing. */  
    /* 已经被关闭,什么也不做*/  
    err = ERR_OK;//设置返回值  
    pcb = NULL;//把pcb指向NULL  
    break;  
  }  

判断这个状态!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

12

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-3-25
在线时间
9 小时
 楼主| 发表于 2014-3-25 16:20:52 | 显示全部楼层
你是说周期性的判断pcb->state的值,如果处于关闭状态就代表网络连接已经断开?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表