|
请教关于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;
}
程序是最基本的最简单的功能。我已经在这里折腾了三四天,请各位大侠不惜赐教,万分感激!
|
|