之前发了一个帖子V7双网口同时使用LWIP,例程有NETCONN客户端,现在在来一个服务器的
1.宏定义
#define MEMP_NUM_TCP_PCB 10 /* MEMP_NUM_TCP_PCB:同时建立激活的TCP数量 */
#define MEMP_NUM_TCP_PCB_LISTEN 10 /* MEMP_NUM_TCP_PCB_LISTEN:能够监听的TCP连接数量 */
#define MEMP_NUM_TCP_SEG 10 /* MEMP_NUM_TCP_SEG:最多同时在队列中的TCP段数量 */
#define MEMP_NUM_SYS_TIMEOUT 10 /* MEMP_NUM_SYS_TIMEOUT:能够同时激活的timeout个数 */
#define MEMP_NUM_NETBUF 10 /* MEMP_NUM_NETBUF: 结构netbuf的数量。(只有在使用顺序API时才需要,如api_lib.c) */
#define MEMP_NUM_NETCONN 10 /* MEMP_NUM_NETCONN: 结构netconns的数量。*(只有在使用顺序API时才需要,如api_lib.c) */
#define MEMP_NUM_TCPIP_MSG_API 20 /* MEMP_NUM_TCPIP_MSG_API: 使用的结构tcpip_msg的数量 *(只在使用tcpip.c时才需要) */
#define MEMP_NUM_TCPIP_MSG_INPKT 20 /* MEMP_NUM_TCPIP_MSG_INPKT: 使用的结构tcpip_msg的数量接收数据包。*(只在使用tcpip.c时才需要) */
创建的TCP连接 不能大于 MEMP_NUM_TCP_PCB ,不然会有问题。
2.服务器的创建
2.1 初始化变量
struct netconn *conn, *newconn;
conn:作为服务器的TCP_PCN
newconn:获取客户端的信息(需要支持很多he护短就需要把MEMP_NUM_TCP_PCB 和 MEMP_NUM_NETCONN 设置比较大 )
2.2 设置conn的网卡信息
netif_set_default(dm9162_netif); //设置netif为默认网口
conn = netconn_new(NETCONN_TCP); //创建一个TCP链接
2.3 绑定connnetconn_bind(conn, IP_ADDR_ANY, TCP_SERVER_PORT); //绑定端口 8000号端口
2.4 监听conn
netconn_listen(conn); //进入监听模式
2.5 等待接受客户端连接
err = netconn_accept(conn, &newconn); //接收连接请求 当有链接了返回 newconn 的值,否则返回 0
当有客户端连接时 会申请一个新的 netconn 并赋值给newconn。
2.6 任务创建
sys_thread_new("dm9162serverthread", tcp_server_threadcreat, newconn, DEFAULT_THREAD_STACKSIZE, osPriorityNormal);
这里创建一个子任务,用来处理 当前 newconn 的交互,子任务的处理方法就类似于客户端的处理方式,参考我之前的帖子即可
3.效果图(这里我程序做了连接限制) |