OpenEdv-开源电子网

标题: lwip 客户端用哪个函数可以判断网络连接的状态 [打印本页]

作者: lxrhy198308    时间: 2014-3-25 14:39
标题: lwip 客户端用哪个函数可以判断网络连接的状态
下面是我的程序,能实现收发功能了。但是前提必须是我先把服务器打开,再运行程序才能连接上服务器进行传输。如果我先运行程序,再打开服务器就连不上了。
因此我想问一下我在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);
    }   
}

作者: lxrhy198308    时间: 2014-3-25 15:15
自己顶一下
作者: 正点原子    时间: 2014-3-25 15:21
帮顶
作者: 象牙塔    时间: 2014-3-25 15:59
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;  
  }  

判断这个状态!
作者: lxrhy198308    时间: 2014-3-25 16:20
你是说周期性的判断pcb->state的值,如果处于关闭状态就代表网络连接已经断开?




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4