Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
网络学习营
【网络编程学习】+the boy no Name+Tcp聊天客户端的实现
发布于 2018-08-01 18:39:23 浏览:1363
订阅该版
* 本帖最后由 guoweilkd 于 2018-8-1 18:39 编辑 * bg8.png开发环境 : win10 + env + qemu-vexpress-a9模拟器 作业的要求是建立一个tcp聊天客户端,需要能识别例如 login who look say 等简单的命令,并且 打印通信数据(聊天显示)。根据作业要求。笔者分析tcp聊天客户端的程序大体需要如下几个过程:1.socket的建立。2.接收数据的相关处理。(分析、打印)。3.发送数据的相关处理(获取数据、解析数据、打包数据、发送)。 为了使程序简单,定义了一个全局结构体变量用于控制socket相关数据。结构体如下。```/* socket控制结构体 */ struct SocketMessage{ uint8_t state; /* 连接状态 */ int sock; /* socket ID */ char *pRevBuff; /* 接收buff指针 */ uint16_t revBuffLen; /* 接收buff大小 */ uint8_t haveSendData; /* 是否有接收数据 */ char *pSendBuff; /* 发送buff指针 */ uint16_t sendBuffLen; /* 发送buff大小 */ }SocketMessage1;``` 面是每个过程的具体实现: 1.tcp客户端的socket建立: tcp客户端建立过程中用到的socket相关函数有:。 1.int socket(int domain,int type, int protocol)。创建socket API 参数 domain:协议域 有 1.AF_INET(Ipv4) 2.AF_INET6(Ipv6) 3.AF_UNIX(UNIX域)4.AF_UNSPEC(未指定) 参数 type: 1.SOCK_DGRAM 长度固定的、无连接的不可靠的报文传递(UDP) 2.SOCK_RAM IP 协议的数据报接口 3.SOCK_STREAM 有序、可靠、双向的面向连接字节流(TCP) 参数protocol:通常是0. 返回值 :大于0 socket socket创建成功标识符 -1 失败 2.struct hostent* gethostbyname(const char*name).获取主机的ip等信息。 参数 name:域名 如 “[www.rt-thread.org](http://www.rt-thread.org/)” 或者 IP地址 如 “192.168.60.1” 返回值 : hostent 结构体指针。 3.int connect(int sockfd,const struct sockaddr *serv_addr, socklen_t addrlen)。socket连接API 参数 sockfd:socket Id.(socket创建时的返回值) 参数 erv_addr:服务器地址相关参数。(存放要连接的服务器的 IP 地址和端口号等信息)。 参数 addrlen:sockaddr 结构体的长度。 返回值:0 成功 -1 失败。 4.int closesocket(intsockfd)。关闭socketAPI. 参数 sockfd:socket Id.(socket创建时的返回值) 返回值:0 成功。 笔者在socket建立连接成功后,给发送和接收各申请了块内存,然后创建接收线程。结束本线程。socket建立完成。细节可以查看源码中的TcpClientMain()函数。 2.接收数据相关的处理: 在tcp客户端的socket建立的线程中笔者创建了一个接收线程,用来接收并处理服务器发过来的数据。 socket接收过程中使用到的相关函数: 1.int recv(int sockfd,void *buf, size_t len, int flags)。socket接收API. 参数 sockfd:socket Id.(socket创建时的返回值)。 参数 buf:接收存放指针。 参数 len:buff可以存放的最大长度。 参数 flag:控制选项,通常为0. 返回值:-1 接收失败。 0 断开连接。 > 0 实际接收到的数据。 笔者在接收线程中,如果检测到socket状态断开,就会自动结束此线程。细节可以查看源码中的TcpRevThreadEntry()函数。 3.发送数据的相关处理: socket发送过程中使用到的相关函数: int send(int sockfd, const void *msg, size_t len,int flags)。socket发送API. 参数 sockfd:socket Id.(socket创建时的返回值)。 参数 msg:发送数据指针。 参数 len:发送长度。 参数 flag:控制选项,通常为0. 返回值:实际接发送的数据。 发送相关的处理也使用了一个单独的线程,由用户在控制台中调用运行。模拟用户数据的相关输入。详细内容而可以查看SendMessage()线程函数。到此,发送线程也就结束了。 测试与现象: 实验步骤: 1.启动env,用 cd命令切换到工程路径下。用 scons命令编译。 2.执行qemu.bat.运行编译完成程序。 3.在命令行中输入 socket建立线程函数TcpClientMain。回车运行。 4.如果服务器连接成功,控制台上会打印出“Welcome to TestChat”。如图: ![rt1.png](/uploads/201808/01/183313s8x8jqixj8xc8q0z.png) 5.在命令行中输入 发送线程函数 SendMessage 聊天命令 内容 如下: ![rt2.png](/uploads/201808/01/183320i7wo7hpyk0pqwohp.png) 上图是登陆命令的发送。如果内容之间有空格 内容用“”包括,例如, SendMessage say “the boy no Name” 6.根据相应命令聊天:![rt3.png](/uploads/201808/01/183330h2g3uvzve8m5ljgm.png) 7.输入 SendMessage close 客户端主动关闭socket.输入 SendMessage logout 服务器端主动关闭socket.![rt4.png](/uploads/201808/01/183331r6cbvh29tw86nbta.png)![rt6.png](/uploads/201808/01/183331vbnhcjuekhesblbj.png) 过程中遇到的问题 通过控制台输入字符串是最头疼的,因为对环境不是特别熟悉。最后就想到了仿照线程输入参数的模式输入。 ![rt5.png](https://oss-club.rt-thread.org/uploads/201808/01/183331w830q1wrv3rin0nw.png)
查看更多
1
个回答
默认排序
按发布时间排序
guoweilkd
2018-08-01
这家伙很懒,什么也没写!
忘传源代码了,附上:[attach]4734[/attach]
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
guoweilkd
这家伙很懒,什么也没写!
提问
18
回答
10
被采纳
0
关注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
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部