LWIP netconn TCP UDP测试 实例

本文由自己从网络上查资料整理而成 已经测试可用

只需修改下就能用到项目中

给需要的童鞋们参考

平台(LM3S9B92+UCOSII+LWIP)



在线IP地址转换器(二进制 十进制 十六进制转换)

http://www.ab126.com/goju/1840.html


LWIP netconn API函数下 实现的

TCP服务器 

TCP客户端

  UDP测试



UDP流程

        conn = netconn_new(NETCONN_UDP);       //创建UDP连接
        netconn_bind(conn,IP_ADDR_ANY, 80);   //绑定端口号
netconn_connect(conn,&destip,destport);
netconn_send(conn,UDPNetbuf);  //收或发
netconn_delete(conn);





主程序(三个线程只打开了一个UDP的TCP测试的被注释了每次打开一个即可测试)

#include <includes.h>
#include	"lwip/sys.h"
#include "user/my_tcp_client.h"
#include "utils/uartstdio.h"
                               /*  Application tasks           */
#define          TASK_INPUT_PRIO       11
#define          TASK_LWIP_PRIO        3


#define taskinputstck    1024
#define tasklwipstck     1024

static  OS_STK       App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE];
OS_STK taskinput_stack[taskinputstck];
OS_STK tasklwip_stack[tasklwipstck];
extern struct netif lwip_netif;
extern void stellarisif_input(void *arg);
extern void httpd_thread(void *arg);
extern void my_lwip_init(void);
extern void tftp_thread(void *arg);

static  void  App_TaskStart   (void *p_arg);


int main (void)
{
	BSP_PreInit ();

	BSP_IntDisAll();

	OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel"          */

    OSTaskCreateExt((void (*)(void *)) App_TaskStart,           /* Create the start task                                */
	                (void           *) 0,
	                (OS_STK         *)&App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE - 1],
	                (INT8U           ) APP_CFG_TASK_START_PRIO,
	                (INT16U          ) APP_CFG_TASK_START_PRIO,
	                (OS_STK         *)&App_TaskStartStk[0],
	                (INT32U          ) APP_CFG_TASK_START_STK_SIZE,
	                (void           *) 0,
	                (INT16U          )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));

	OSStart();
}


static  void  App_TaskStart (void *p_arg)
{
	(void)p_arg;


    BSP_PostInit();                                             /* Initialize BSP functions                             */
																
	Tmr_TickInit ();										    /* Initialize the SysTick                               */
	my_lwip_init();
    
    OSTaskCreate(stellarisif_input,
                 (void *)&lwip_netif,
                 &taskinput_stack[taskinputstck - 1],
                 TASK_INPUT_PRIO);
	//OSTaskCreate(httpd_thread,
	/*OSTaskCreate(tftp_thread,
                 (void *)0,
                 &tasklwip_stack[tasklwipstck - 1],
                 TASK_LWIP_PRIO);*/
	/*	OSTaskCreate(my_tcp_client_thread,
                 (void *)0,
                 &tasklwip_stack[tasklwipstck - 1],
                 TASK_LWIP_PRIO);*/

//	sys_thread_new("tcpserv",my_tcp_server_thread, (void *)0, 1024, 2);  //测试TCP服务器
//	sys_thread_new("tcpclt",my_tcp_client_thread, (void *)0, 1024, 2);   //测试TCP客户端
	sys_thread_new("udp",my_udp_thread, (void *)0, 1024, 2);              //测试UDP


#if (OS_TASK_STAT_EN > 0)
    OSStatInit();                                               /* Determine CPU capacity                               */
#endif                           

	for(;;)
	{
		OSTaskSuspend(OS_PRIO_SELF);                            /*  The start task can be pended here.                  */  
	}
}



测试程序

头文件

#ifndef  __MY_TCP_CLIENT_H__
#define  __MY_TCP_CLIENT_H__



void my_tcp_server_thread(void *arg);
void my_tcp_client_thread(void *arg);
void my_udp_thread(void *arg);
#endif


.C文件

 #include "includes.h"               /* uC/OS interface */
#include "lwip/api.h"

#include <stdio.h>
#include <string.h>

#include "user/my_tcp_client.h"
#include "utils/uartstdio.h"
//*********************************************************
//
//			  tcp 服务器端测试程序
//
//*********************************************************
void my_tcp_server_thread(void *arg)
{
    struct netconn *conn, *newconn = NULL;
    struct netbuf        *TCPNetbuf;
	char getText[]="hello i am server!";
    
    conn = netconn_new(NETCONN_TCP);      /* 创建TCP连接  */
    netconn_bind(conn,NULL,80);           /* 绑定本地地址和监听的端口号 */  
    netconn_listen(conn);                 /* 进入监听状态 */

	UARTprintf("\033[2JTCP listening\n");
    while(1)
    {
      newconn = netconn_accept(conn);    /*阻塞当前进程到有数据接收 */
      if(newconn != NULL)
      {    
                 /* 发送数据  */
                netconn_write(newconn,(void *)&getText,sizeof(getText),NETCONN_NOCOPY);
                netbuf_delete(TCPNetbuf);         
            netconn_close(newconn);       /* 关闭连接   */
            
          while(netconn_delete(newconn) != ERR_OK)
            OSTimeDlyHMSM(0, 0, 1, 0);
      }
    }
}
//*********************************************************
//
//			  tcp 客户端测试程序
//
//*********************************************************
void my_tcp_client_thread(void *arg)
{
    struct netconn *conn;
    struct netbuf        *TCPNetbuf;
//	char *dat;
	err_t myerr;
	char Text[]="hello i am client!";
	static struct ip_addr serverip; 		  //目标机IP
    static unsigned short serverport;       //目标机端口号


	serverip.addr = htonl(0xC0A8016A);		 //192.168.1.106
	serverport=7000;    
    conn = netconn_new(NETCONN_TCP);      /* 创建TCP连接  */
    netconn_bind(conn,NULL,7000);           /* 绑定本地地址和监听的端口号 */ 

	OSTimeDlyHMSM(0, 0, 3, 0);
	UARTprintf("\033[2JTCP connect....\n"); 
	myerr=netconn_connect(conn,&serverip,serverport);			 //连接主机 cnn,目标机IP,端口号
	if(myerr==-1)
	{
		UARTprintf("\033[2JTCP connect err\n");
	}else{
	 	UARTprintf("\033[2JTCP connect ok\n");
	}
   /* 建立一个新的netbuf */
	TCPNetbuf =netbuf_new();
//	netbuf_alloc(TCPNetbuf, 40);
	/* 引用这个文本给netbuf */
	netbuf_ref(TCPNetbuf,Text,sizeof(Text));
 
    while(1)
    {   	
			OSTimeDlyHMSM(0, 0, 3, 0);
			/* 发送文本 */
			netconn_send(conn,TCPNetbuf);
			netconn_write(conn,(void *)&Text,sizeof(Text),NETCONN_NOCOPY);
            OSTimeDlyHMSM(0, 0, 3, 0);
			/* 删除conn和buf */
			netconn_delete(conn);
			netbuf_delete(TCPNetbuf);
    }
}

//*********************************************************
//
//			  tcp 客户端测试程序
//
//*********************************************************
void my_udp_thread(void *arg)
{
        static struct netconn *conn;
        static struct netbuf  *UDPNetbuf;
        static struct ip_addr destip; 		  //目标机IP
        static unsigned short destport;       //目标机端口号
        unsigned char Array[]="hello i am udp!";


		destip.addr = htonl(0xC0A8016A);		 //192.168.1.106
	    destport=7000;  
		   /* 建立一个新的netbuf */
//		UDPNetbuf =netbuf_new();

        conn = netconn_new(NETCONN_UDP);       //创建UDP连接
        netconn_bind(conn,IP_ADDR_ANY, 80);   //绑定端口号

        while(1)
        {
		 OSTimeDlyHMSM(0, 0, 3, 0);
		 UARTprintf("\033[2JUDP connec...\n");
		 /* 连接远程主机 */
		netconn_connect(conn,&destip,destport);
		/* 建立一个新的netbuf */
		UDPNetbuf= netbuf_new();	
		
		/* 引用这个文本给netbuf */
		netbuf_ref(UDPNetbuf,Array, sizeof(Array));
		/* 发送文本 */
		netconn_send(conn,UDPNetbuf);
			OSTimeDlyHMSM(0, 0, 3, 0);	
		
		/* 删除conn和buf */
		netconn_delete(conn);
		netbuf_delete(UDPNetbuf);	   			//释放缓冲区
        }  


}


最后附上一个TCP服务器接收并把收到的数据返回的参考


        /* Grab new connection. */
        newconn = netconn_accept(conn);
    
        /* Process the new connection. */
        if (newconn) 
        {
          struct netbuf *buf;
          void *data;
          u16_t len;
      
          while ((buf = netconn_recv(newconn)) != NULL) 

          {
            do 
            {
              netbuf_data(buf, &data, &len);
              netconn_write(newconn, data, len, NETCONN_COPY);
            } 
            while (netbuf_next(buf) >= 0);
          
            netbuf_delete(buf);
          }
        
          /* Close connection and discard connection identifier. */
          netconn_close(newconn);
          netconn_delete(newconn);


参考文章 http://www.amobbs.com/thread-5059971-1-1.html

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: lwip是一个轻量级网络协议栈,其中的netconn_listen函数用于将指定的TCP连接设置为监听模式。当lwip中的netconn_listen函数卡死时,可能由以下原因引起: 1.服务器资源不足:如果服务器处理的连接数超过其承载能力,就有可能导致netconn_listen函数卡死。这可能是由于服务器性能较低、负载过高或者并发连接数过多引起的。解决办法是优化服务器性能、增加服务器资源或者限制并发连接数。 2.网络丢包或拥塞:如果在netconn_listen函数执行期间发生网络丢包或者网络拥塞,可能会导致函数卡死。这可能是由于网络延迟、带宽限制或者网络故障引起的。解决办法是检查网络连接,保证网络质量良好,并且合理处理网络拥塞。 3.代码逻辑错误:netconn_listen函数在调用时的参数设置不正确,也有可能导致函数卡死。可以通过检查代码逻辑,确保正确使用该函数和传递正确的参数来解决该问题。 4.其他原因:除上述原因外,还有可能是由于硬件故障、软件冲突或者系统错误等引起的。可以通过重新启动硬件、解决软件冲突或者检查系统错误日志来解决这些问题。 在调试lwip中的netconn_listen函数卡死问题时,可以先排除以上可能原因,逐一检查并排查问题所在,以便找到合适的解决办法。 ### 回答2: lwip是一个用于嵌入式系统的网络协议栈,其中的netconn_listen函数用于将一个TCP连接的套接字设置为监听状态。然而,有时候netconn_listen函数可能会出现卡死的情况。 造成lwip netconn_listen卡死的原因有很多,以下是常见的一些可能原因: 1. 资源耗尽:如果系统中的资源不足,例如内存或者网络连接数达到了上限,netconn_listen函数可能会卡死。这通常发生在系统运行时间较长或者负载较高的情况下。 2. 配置问题:配置参数和系统设置的不正确或者不匹配也可能导致netconn_listen函数卡死。在使用lwip时,需要确保正确配置了网络设备和协议栈相关的参数,以及正确实现了必要的回调函数。 3. 网络问题:netconn_listen函数卡死还可能是由于网络相关问题造成的,例如网络连接不稳定、网络延迟过高等。 要解决lwip netconn_listen卡死的问题,可以尝试以下步骤: 1. 检查系统资源:确认系统的内存和网络连接数是否足够,如果不足,尝试增加资源。可以使用相关的性能分析工具来监视系统资源的使用情况。 2. 检查配置参数:仔细检查lwip的配置参数和设备驱动的配置,确保其正确性和一致性。 3. 进行网络调试:使用网络调试工具来分析网络连接的状态和性能,检查是否有网络相关的问题。 4. 更新lwip库版本:如果使用的lwip库版本较旧,尝试更新到最新版本,以获取改进的稳定性和bug修复。 5. 检查应用程序代码:检查应用程序中关于lwip的使用是否正确,确保正确调用netconn_listen函数,并且正确处理事件回调函数。 总之,要解决lwip netconn_listen卡死的问题,需要检查系统资源、配置参数、网络及应用程序代码,并根据问题的具体原因进行相应的调整和优化。 ### 回答3: lwip是一个轻量级的网络协议栈netconn_listen是lwip中用于监听网络连接的函数。当调用netconn_listen函数时出现卡死的情况可能有以下几个原因: 1. 网络连接错误:可能是由于网络连接的问题,例如网络延迟或断开,导致调用netconn_listen函数时无法建立正确的连接,从而导致卡死。 2. 资源耗尽:如果系统资源(如内存)不足,或者已经达到了系统所能处理的最大连接数,调用netconn_listen函数可能会导致卡死。 3. 死锁:在多线程环境下,如果存在死锁情况,即多个线程相互等待对方释放的资源,调用netconn_listen函数可能会导致卡死。 为了解决这个问题,可以尝试以下几个方法: 1. 检查网络连接:确认网络连接是否正常,在执行netconn_listen函数之前,可以先检查网络状态,确保网络连接正常。 2. 调整系统资源:如果系统资源不足导致卡死,可以尝试增加系统可用资源,例如增加内存容量或调整系统的最大连接数。 3. 检查死锁情况:如果存在死锁情况,需要仔细检查代码逻辑,避免出现多个线程相互等待对方释放资源的情况,可以使用调试工具来定位并解决死锁问题。 总之,lwip netconn_listen卡死可能是由于网络连接错误、资源耗尽或死锁等原因引起的。需要通过排查问题所在,并采取相应的解决方案来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值