Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
[网络编程学习]+_xiangxi+实现一个简单的TCP客户端
发布于 2018-08-02 00:10:00 浏览:1583
订阅该版
* 本帖最后由 _xiangxi 于 2018-8-2 00:10 编辑 * 大家好,十分感谢给我这次机会来参加此次网络编程学习营的培训,在群里的学习资料和群里大神的悉心协作下,完成了本周的学习任务;此外,在本周的作业的完成上,查阅了大佬发表的帖子,另外加上自己的简单编程,完成了本周的作业。在本周的学习内容有:QEMU 平台 [list] (*)[在 Windows QEMU 上运行 RT-Thread](http://ci.rt-thread.com/3067/site/topics/qemu/setup/) (*)[安装和配置 TAP 网卡](http://ci.rt-thread.com/3067/site/topics/tools/tap/setup/) (*)[Windows 下的 QEMU 网络开发环境搭建](http://ci.rt-thread.com/3067/site/topics/qemu/network/) (*)[Socket TCP/UDP 背景知识](http://ci.rt-thread.com/3067/site/tutorial/network/socket/socket/) (*)[Wireshark 工具抓包](http://ci.rt-thread.com/3067/site/tutorial/network/wireshark/wireshark/) (*)[ICMP(Ping) 包分析](http://ci.rt-thread.com/3067/site/tutorial/network/ICMP_PING/ICMP_PING/) (*)[TCP 客户端](http://ci.rt-thread.com/3067/site/tutorial/network/tcpclient/tcp-client/) (*)[UDP 客户端](http://ci.rt-thread.com/3067/site/tutorial/network/udpclient/udp-client/) (*)[TCP 三次握手与四次挥手](http://ci.rt-thread.com/3067/site/tutorial/network/TCP_handshake_wave/TCP_handshake_wave/) (*)[UDP 包分析](http://ci.rt-thread.com/3067/site/tutorial/network/UDP/UDP/) (*)[NTP 获取网络时间](http://ci.rt-thread.com/3067/site/tutorial/network/ntp/ntp/) (*)[Telnet 远程登陆](http://ci.rt-thread.com/3067/site/tutorial/network/telnet/telnet/) (*)[TFTP 文件传输](http://ci.rt-thread.com/3067/site/tutorial/network/tftp/tftp/) [/list]![FastAdmin]() **第一部分:学习时遇到的问题**1.网络问题 网络问题是比较常发生的(我记得群里很多人问过这个问题,偷偷总结的),解决起来也比较简单。如果 ping [www.baidu.com](http://www.baidu.com)超时,这是使用ifconfig指令查询本机的ip,![001.png](/uploads/201808/01/220656w2bb2s8j84y54acj.png)如果查看到是未获取到地址,这是已经基本确定是网络问题,打开电脑网络适配器![002.png](/uploads/201808/01/221201oyuskdtdkkffnsro.png)这里是把自己正在上网的那个上网方式共享给tap![003.png](/uploads/201808/01/221225n1gsr915g55rorrw.png)这个是正确获取到IP,大部分ifconfig获取不到ip时候,就是这里未获取到IP;**解决办法:把网络共享关闭再打开,重新打开qemu.bat就可以了。**2.指令丢失问题* ping丢失 * tcpclient指令丢失 * udpclient指令丢失 指令丢失问题,如果用Keil编译过程序,大家都知道,每次编译都会更新一个.c文件的编译文件.o文件,大家可以在下边的那个框里看得到。 在RTT提供的在env环境下,以tcpclient为例,用scons指令编译,如果没有发现tcpclient.o文件生成记录,这是你就应该敏锐得想到是没有编译过tcpclient.c文件,里面的tcpclient指令自然不可能出现,也就是我所说的指令丢失问题。![004.png](/uploads/201808/01/222612my6wgne9vxfsolwf.png)这里大家就可以看到ping.o和tcpclient.o文件生成,这是也就不会出现对应指令丢失的情况。好了,既然这样知道为什么指令会丢失,也就可以解决这个问题:没有编译这个.c文件,应该是没有添加进去工程,那我把这个.c文件加进这个工程不就可以了?思路就是这样,我们这时候还是要用到RTT提供的env环境,![005.png](/uploads/201808/01/223128hjjjy9i35azjx29y.png)这个工具真的是非常好用(在不了解时候只是按照说明点啊点),通过这个工具,可以自动得添加.c文件到一个工程中,他的具体实现原理,是靠一个宏(在RT-Thread15天入门教程中,老师执着得使用scons工具进行工程的创建,把每节课需要的.c通过scons命令加入工程中靠得就是宏定义的方式)。![006.png](/uploads/201808/01/223708eixqebz21bmkm8if.png)![007.png](/uploads/201808/01/223717r3664znhh8i698t9.png)你可以理解为,env工具的使用就是配置了这些宏,进而添加了各种功能.c文件进入工程。具体的env工具使用方法,可以参照[env 工具使用手册](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/)指令丢失的直接原因就是相应的.c文件未被编译,然后需要在env工具上配置。假如你在配置的过程中发现:嗯嗯~~~帖子上的这个界面怎么和我的不一样?为什么我的没有这个选项?诸如此类问题的时候,不要慌,因为是正常的。env工具使用手册下,是有这个解释的![008.png](/uploads/201808/01/224629eaakjf3a5qxtap8c.png)这时你通过pkgs --upgrade命令更新了env工具,找到了自己需要的功能,打开了需要打开的宏。并且又通过scons命令编译了工程。幸运的话,编译成功,tcpclient命令正常,功能正常;如果很不幸,还是没有找到tcpclient.o的编译记录,你可以通过 pkgs --update更新软件包,没错就是RT_Thread源码(如果不会科学上网的话,下载过程相当漫长,有下载失败的风险)。**运气很好的是,现在已经支持自动更新软件包和镜像网站下载了(当然你需要先获取最新版)**![009.png](/uploads/201808/01/225957mveogvv6vt660oce.png)一般,如果这些都顺利就不用看这一行了,不过我是相当不顺利的那种。我最终是重新到Github上下载了最新版的mater版本的才又顺利进行下去的。3.再往下,教程上都说明得很充分了,后面的实验没有出现什么问题,不过下载这几个工具,倒是耗费不少时间。![putty-64bit-0.70-installer.msi](/uploads/201808/01/230816s6tthp1h9zansj1j.attach)![Tftpd64-4.60-setup.exe](/uploads/201808/01/230827xzhh5ab171122e3r.attach)![tap-windows-9.21.2.exe](/uploads/201808/01/231106dk3k8wbk0wjzez7b.attach)还有一个Wireshark太大上传不上来,还有网络调试助手太常见就不上传了,需要可以在帖子下回复。**第二部分:做作业时出现的问题**![010.png](/uploads/201808/01/231629kodt9iod59goidam.png)第一眼看到题目,说实话是有一点懵逼的。毕竟,之前从来没有弄过这个,只是在教程中做过tcpclient客户端的实验。不过,懵逼归懵逼,作业还是要做的,我开始想怎么完成这个作业,我的第一个问题是:我怎么把我的程序跑起来,我是依照在tcpclient.c文件里直接改还是再自己添加一个,c文件,我之前只是看RT-Thread添加一些宏,也不清楚这些是怎么把.c文件关联起来的,直到看到了群里大哥的帖子[https://club.rt-thread.org/ask/question/7604.html](https://club.rt-thread.org/ask/question/7604.html),手动@Jack_Lin,然后我就依样画瓢添加了自己的.c文件,并且通过编译。![011.png](/uploads/201808/01/232702d1j1q1ae1q911111.png)1.第一个版本使用了MSH_CMD_EXPORT(logout, logout the account)导出命令的方式嗯嗯~~~能和服务器交互了,不过,不是符合作业要求的。(作业要求自动发送这些指令,并且按照格式输出),所以,我的办法是再添加一个线程,于是就有了第二个版本。2.第二个版本,采用了中规中矩的创建线程的方法线程内代码:![012.png](/uploads/201808/01/233355bq8b8999uxwbbg1j.png)不过,毕竟是自动的,服务器响应时间会不太够,所以每段指令都会挂起500滴答时钟,而且另一个接收服务器的线程是另外一个,所以必须挂起。3.作业有一个问题是需要用say指令发送通过look指令查询到的聊天室人名发送到服务器所以,依靠tcpclient.c源代码是不足够了,需要添加记录从服务器发送回来的代码,才能实现功能![013.png](/uploads/201808/01/234320jaiclskislil6wcx.png)这里是实现代码 /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if(number_cnt == 5) { strcat(send_data1,recv_data); //清除掉
部分 number_value = strlen(send_data1); for(i = 0;i < number_value; i++) { if(send_data1* == '
' || send_data1 == ' ')* * send_data1** = ' '; } strcat(send_data1,"in the room"); number_value = strlen(send_data1); send_data1[number_value] = '\0'; } *这里要把服务器发回的数据进行删减,因为服务器发回的数据包含
这个数据一旦直接发回服务器就是截止的意思,会造成服务器提前终止接收,而产生Unknown Command的意外回复。同时,recv_data[bytes_received] = '\0';要放在if判断语句之前,因为rt_melloc()申请来的内存并没有清楚,只是新数据覆盖到旧数据上如果放在if语句后会出现上条指令遗留的数据。 *![015.png](/uploads/201808/01/235956odvrev8mdsldprve.png) ![014.png](/uploads/201808/01/235524p9w94gln40ww9wwi.png)*这就是我本周遇到的问题,以及总结的解决办法,还有本周作业的完成情况。在此感谢群内大佬给予的帮助,特别感谢@改个名字大哥提供的帮助,建议和资源。 第一次正式写RTT帖子,如果格式不对还请批评指正,另外,欢迎大家交流提供自己的经验和问题。
查看更多
1
个回答
默认排序
按发布时间排序
ianhom
2018-08-02
这家伙很懒,什么也没写!
够详细了
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
_xiangxi
这家伙很懒,什么也没写!
提问
9
回答
47
被采纳
1
关注TA
发私信
相关问题
1
【LWIP学习营】第一关开发环境搭建
2
LWIP学习营第一周入门移植问题汇总贴
3
【LWIP学习营】f407+lan8720A小结
4
【LwIP学习营】【第一周】仅零散记录,无主题
5
【LWIP学习营】正点原子探索者F407+LAN8720第一周小结
6
【LwIP学习营】【第一周】网络通信基础及实现TCP 聊天客户端
7
【LwIP学习营】【第一周】LWIP移植
8
【LwIP学习营】【第一周】LWIP移植
9
【LwIP学习营】【第一周】开发板适配
10
【LwIP学习营】【第一周】环境搭建和配置验证
推荐文章
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
RT Thread 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
12
次点赞
Wade
2
篇文章
2
次点赞
xiaorui
1
篇文章
1
次点赞
zhuzhuzhu
1
篇文章
1
次点赞
catcatbing
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部