本文由自己从网络上查资料整理而成 已经测试可用
只需修改下就能用到项目中
给需要的童鞋们参考
平台(LM3S9B92+UCOSII+LWIP)
在线IP地址转换器(二进制 十进制 十六进制转换)
http://www.ab126.com/goju/1840.html
LWIP netconn API函数下 实现的
TCP服务器
TCP客户端
UDP测试
UDP流程
conn = netconn_new(NETCONN_UDP); //创建UDP连接
主程序(三个线程只打开了一个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