7051|3

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教关于lwip作为服务器只能连接有限次的问题 [复制链接]

请教各位:
我的ARM作为服务器端,采用lwip的Raw API 。遇到如下问题:如果使用tcp_listen(),使用网络助手作为客户端,去连接我的服务器,总共只能连接TCP_DEFAULT_LISTEN_BACKLOG次。
如果使用tcp_listen_with_backlog(pcb, n);则总共只能连接n次。(其实这两是一个意思。)都是断开后再连。代码如下:
//-----------------------------------------------------------------------------
//
// 初始化TCP服务器
//
//-----------------------------------------------------------------------------
void ServerTcpInit(void)
{
  // 本地服务器地址
  IP4_ADDR(&server_ipaddr,10,36,1,168);  

  // 建立通信的TCP控制块            
  local_pcb_tcp = tcp_new();     

  // 绑定本地IP地址和端口号4000                     
  tcp_bind(local_pcb_tcp,&server_ipaddr,4000);   

  //开始侦听远程客户端的链接请求
  local_pcb_tcp = tcp_listen_with_backlog(local_pcb_tcp,1);//使用这个函数就只能连接一次,断开后就再连接不上了

//注册接收到连接回调函数
  tcp_accept(local_pcb_tcp,ServerTcpAccept);

//   local_pcb_tcp = tcp_listen(local_pcb_tcp);

}
//-----------------------------------------------------------------------------
//
// 接收到链接回调函数
//
//-----------------------------------------------------------------------------
err_t ServerTcpAccept(void *arg, struct tcp_pcb *newpcb,err_t err)
{
  if((err != ERR_OK))
  {
    u1_connect_flag = 0;
    // 清除一些TCP回调函数,
    tcp_arg(newpcb, NULL);
    tcp_err(newpcb, NULL);
    tcp_poll(newpcb, NULL, 1);

    // 关闭TCP连接
   tcp_close(newpcb);
   
    return(err);
  }
                       
  
               
    // 设置TCP连接优先级,当存在几个链接时,此函数相当重要
    tcp_setprio(newpcb, TCP_PRIO_MIN);
    //tcp_setprio(newpcb, TCP_PRIO_MAX);
   // 设定接收回调函数
    tcp_recv(newpcb,ServerTcpRecved);
   // 设定错误回调函数
    tcp_err(newpcb, ServerTcpError);       
  
    // 设定轮循函数                       
    tcp_poll(newpcb, ServerTcpPoll, 10);       
        return ERR_OK;
}
//-----------------------------------------------------------------------------
//
// 接收到数据回调函数
//
//-----------------------------------------------------------------------------
err_t ServerTcpRecved(void *arg,struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
        err_t close_err;
   //如果收到的数据不为空
   if((err==ERR_OK) && (p!=NULL))                                            
   {
     // 将接收到的数据存储到接收缓冲区中,注意p->len不是接收到数据的个数
   //memcpy(u8_recv_data_buff, p->payload, p->len);
     // 通知TCP正在处理数据,可以接收更多的数据
        tcp_recved(tpcb,p->tot_len);
         memcpy(u8_recv_data_buff, p->payload, p->len);     
       
      // 释放缓冲区数据      
    pbuf_free(p);                                         
   }
   // 如果对方断开连接,会接收到一个NULL                                                                                  
   else if((err == ERR_OK) && (p == NULL))                                       
   {       
               
        // 此时就关闭连接,释放资源                                                                          
                close_err = tcp_close(tpcb);
                return close_err;
               
   }
   return ERR_OK;  
}

程序是最基本的最简单的功能。我已经在这里折腾了三四天,请各位大侠不惜赐教,万分感激!
此帖出自ARM技术论坛

最新回复

一样遇到了此问题,不知楼主解决没?  详情 回复 发表于 2013-1-25 14:43
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
没有人用过lwip吗?讨论讨论吧。只要有回复的都非常感谢。
此帖出自ARM技术论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一样遇到了此问题,不知楼主解决没?
此帖出自ARM技术论坛

点评

暂时是解决了,通过调试发现在tcp_listen_input(struct tcp_pcb_listen *pcb)中有这样的语句:#if TCP_LISTEN_BACKLOG pcb->accepts_pending++; #endif;而在tcp_close(struct tcp_pcb *pcb)函数里没有相应的  详情 回复 发表于 2013-2-28 15:45
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 混世小天魔 的帖子

暂时是解决了,通过调试发现在tcp_listen_input(struct tcp_pcb_listen *pcb)中有这样的语句:#if TCP_LISTEN_BACKLOG
    pcb->accepts_pending++;
#endif;而在tcp_close(struct tcp_pcb *pcb)函数里没有相应的减操作,于是在case CLOSE_WAIT:状态下,添加tcp_listen_pcbs.listen_pcbs->accepts_pending--;语句,可以了。不知道我这样解决对不对,反正是用着了。要是你有什么好的解决办法,请指正。
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表