Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DIY综合交流区
[RealTouch例程]TCP/IP网络组件Lwip之 TCP Client
发布于 2012-09-07 07:03:23 浏览:12691
订阅该版
实验目的 ? 快速了解Lwip组件。 ? 了解TCP传输协议的应用,熟悉 TCP Server 和 TCP Client 之间的通信机制。 硬件说明 本实验使用RT-Thread官方的Realtouch开发板作为实验平台。涉及到的硬件主要为 ? RJ45接口,作为网络连接的需要,我们需要用网线将Realtouch和目标机连接起来,具体请参见《Realtouch开发板使用手册》 ? 串口3,作为rt_kprintf输出,需要连接JTAG扩展板 实验原理及程序结构 实验设计 TCP 全称为 Transmission Control Protocol,中文名为传输控制协议。TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。 本实验中 RealTouch作为TCP Client,PC机作为TCP Server,两机进行网络通信。 源程序说明 系统依赖 在rtconfig.h中需要开启 ``` #define RT_USING_HEAP``` 此项可选,开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则此项不是必要的 ``` #define RT_USING_LWIP``` 此项必须,本实验使用LWIP组件,因此需要开启此项 ``` #define RT_USING_CONSOLE``` 此项必须,在开始过程中仍需通过串口进行显示相关的工作 主程序说明 首先,在初始化线程中完成了网络驱动的初始化,lwip初始化,然后开启了tcpsrv。 ```void rt_init_thread_entry(void* parameter) { #ifdef RT_USING_LWIP /* initialize eth interface */ rt_hw_stm32_eth_init(); #endif #ifdef RT_USING_COMPONENTS_INIT /* initialization RT-Thread Components */ rt_components_init(); #endif rt_platform_init(); /* do some thing here. */ tcpclient("192.168.1.11", 4663); } int rt_application_init() { rt_thread_t init_thread; init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, 8, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); return 0; } ```tcpcli所有的操作均在tcpclient.c中的tcpclient()函数中完成,源码配有详尽中文注释,可以帮助进一步你了解其工作机制。 ```#include
#include
/* 为了解析主机名,需要包含netdb.h头文件 */ #include
/* 使用BSD socket,需要包含sockets.h头文件 */ #define BUFSZ 1024 static const char send_data[] = "This is TCP Client from RT-Thread."; /* 发送用到的数据 */ void tcpclient(const char *url, int port) { char *recv_data; struct hostent *host; int sock, bytes_received; struct sockaddr_in server_addr; /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ host = gethostbyname(url); /* 分配用于存放接收数据的缓冲 */ recv_data = rt_malloc(BUFSZ); if (recv_data == RT_NULL) { rt_kprintf("No memory "); return; } /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { /* 创建socket失败 */ rt_kprintf("Socket error "); /* 释放接收缓冲 */ rt_free(recv_data); return; } /* 初始化预连接的服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 连接到服务端 */ if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 连接失败 */ rt_kprintf("Connect error "); /*释放接收缓冲 */ rt_free(recv_data); return; } while (1) { /* 从sock连接中接收最大BUFSZ - 1字节数据 */ bytes_received = recv(sock, recv_data, BUFSZ - 1, 0); if (bytes_received <= 0) { /* 接收失败,关闭这个连接 */ lwip_close(sock); /* 释放接收缓冲 */ rt_free(recv_data); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = ' '; if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ lwip_close(sock); /* 释放接收缓冲 */ rt_free(recv_data); break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf(" Recieved data = %s " , recv_data); } /* 发送数据到sock连接 */ send(sock, send_data, strlen(send_data), 0); } return; } #ifdef RT_USING_FINSH #include <finsh.h> /* 输出tcpclient函数到finsh shell中 */ FINSH_FUNCTION_EXPORT(tcpclient, startup tcp client); #endif 值得注意的是tcpclient.c 16 host = gethostbyname(url); url为传入的参数,可以是域名也可以直接是IP地址,所以tcpclient()函数可以设置为如下形式: tcpclient("192.168.1.52",4663); tcpclient("baidu.com",80); ```编译调试及观察输出信息 编译请参见《RT-Thread配置开发环境指南》完成编译烧录,参考《Realtouch开发板使用手册》完成硬件连接,连接好串口线,连上网线。 首先在运行板上程序之前要做的是打开PC上的TCP Server客户端: ![tcpcli.png](/uploads/88_9935bd66da5c62362b6c66dc9df85a9f.png) 接着运行板上程序后后可以看到串口有如下的信息: ``` | / - RT - Thread Operating System / | 1.1.0 build Aug 29 2012 2006 - 2012 Copyright by rt-thread team TCP/IP initialized! finsh>>``` 但是!!!现在你不会看到任何现象。因为!!请看: ```while (1) { /* 从sock连接中接收最大BUFSZ - 1字节数据 */ bytes_received = recv(sock, recv_data, BUFSZ - 1, 0); if (bytes_received <= 0) { /* 接收失败,关闭这个连接 */ lwip_close(sock); /* 释放接收缓冲 */ rt_free(recv_data); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = ' '; if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ lwip_close(sock); /* 释放接收缓冲 */ rt_free(recv_data); break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf(" Recieved data = %s " , recv_data); } /* 发送数据到sock连接 */ send(sock, send_data, strlen(send_data), 0); } ```只有你从Server端发送数据以后,Client才回返回相应数据: ![tcpcli2.png](/uploads/88_fd539d75669a8b00f59200ce7d49c1bb.png) 同时串口上我们可以看到: Recieved data = a 结果分析 通过以上内容的实际操作,实现了TCP server与client的连接,并且进行了数据通信。 ![实验7_4TCPIP网络组件Lwip之 TCP Client.pdf](/uploads/88_53be389f047f55c1af261182b9c0a9b3.pdf) ![component_lwip_tcpcli.zip](/uploads/88_adf63ec42921aee071c3edb040efb66a.zip)
查看更多
5
个回答
默认排序
按发布时间排序
xue110592
2012-09-12
这家伙很懒,什么也没写!
这个超强。有了注释,再看代码,对TCP机制了解就好入手了。
zhou__mi
2013-08-12
这家伙很懒,什么也没写!
正需要,学习中。。。谢谢
liuxiaoyue
2014-10-27
这家伙很懒,什么也没写!
网络可以ping通,但网络调试助手显示无连接对象,为什么
Davidshang
2017-12-27
这家伙很懒,什么也没写!
>网络可以ping通,但网络调试助手显示无连接对象,为什么 --- 和你一样能Ping同,客户端连接不上服务器端口
撰写答案
登录
注册新账号
关注者
0
被浏览
12.7k
关于作者
shaolin
这家伙很懒,什么也没写!
提问
115
回答
444
被采纳
0
关注TA
发私信
相关问题
1
[项目]搞个开源的硬件项目
2
硬件计划贴,及时更新,欢迎提意见
3
软件计划贴,及时更新,欢迎提意见::WMA,MOUNT,LWIP等问题急需解决.
4
MMS协议
5
定点的wma解压库-libwma
6
QQ群记录 [20090821]
7
STM32网络收音机PCB报名征集
8
第一版调试记录
9
第二版硬件讨论
10
RADIO项目相关模块规格--欢迎大家自己做板时规格与此兼容,减少重复劳动
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
TinyUSB Demo运行教程
2
RT-Thread学习大礼包一键带走!
3
freemodbus从机调试说明
4
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
5
基于 RT-Thread 星火一号开发板的俄罗斯方块
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
rv666
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部