C语言客户端接收服务器数据解析与好友系统实现
这段代码实现了一个C语言客户端程序,用于接收来自服务器的数据并进行解析。
recv_data 函数
该函数负责接收服务器发送来的数据,并根据数据类型进行相应的处理。
- 接收数据: 首先,使用recv函数接收服务器发送来的数据,并将数据存储在buf数组中。
- 数据解析: 然后,使用strtok函数将接收到的数据根据分隔符' ':'进行分割,并根据不同的数据类型进行处理。
- 处理群聊消息: 如果数据类型为'talkall',则进入群聊消息接收循环,不断接收并打印群聊消息。直到收到'quitalltalk'命令,退出群聊消息接收循环。
- 处理好友系统数据: 如果数据类型为'friendsys',则进入好友系统数据接收循环,不断接收并处理好友系统相关数据。
- 处理好友列表: 如果数据类型为'friendlist',则接收并打印好友列表数据。
- 处理添加好友: 如果数据类型为'addfriend',则接收添加好友请求,并根据服务器返回的结果进行相应的提示。
- 处理删除好友: 如果数据类型为'deletefriend',则接收删除好友请求,并根据服务器返回的结果进行相应的提示。
- 处理好友私聊: 如果数据类型为'talkfriend',则进入好友私聊数据接收循环,不断接收并处理好友私聊消息。
- 其他数据类型: 处理其他数据类型,例如朋友圈数据。
client_friendsys 函数
该函数实现了一个简单的C语言好友系统,提供以下功能:
- 查看好友列表: 发送'friendlist'命令,获取并打印好友列表。
- 添加好友: 发送'addfriend'命令,输入要添加的好友名称或IP地址,并根据服务器返回的结果进行相应的提示。
- 删除好友: 发送'deletefriend'命令,输入要删除的好友名称或IP地址,并根据服务器返回的结果进行相应的提示。
- 好友私聊: 发送'talkfriend'命令,输入要私聊的好友名称或IP地址,并创建一个新的线程进行私聊。
- 退出好友系统: 发送'quitfriend'命令,退出好友系统。
代码分析
问题:
你提到了代码中if(strncmp(friendlistbuf, "none", strlen(friendlistbuf)) == 0)条件判断语句的执行问题,你观察到friendlistbuf为空,但代码仍然进入了if语句,并打印了“目前暂无好友”的提示。
原因:
friendlistbuf为空,说明它并没有接收到任何数据。在C语言中,数组的空字符串表示它只有一个元素,即空字符'�'。因此,即使friendlistbuf为空,它仍然满足strncmp(friendlistbuf, "none", strlen(friendlistbuf)) == 0)条件,因为strlen(friendlistbuf)等于0,而strncmp函数在比较字符串长度为0的情况下,都会返回0。
解决方案:
为了解决这个问题,需要判断friendlistbuf是否为空,而不是直接判断它的内容是否为'none'。修改代码如下:
if(strlen(friendlistbuf) == 0)//无好友
{
printf("friendlistbuf:%s\n", friendlistbuf);
printf("目前暂无好友\n");
break;
}
注意:
- 确保在使用friendlistbuf之前,已经对其进行了正确的初始化。
- 使用strlen函数来判断数组是否为空,而不是直接判断它的内容。
优化建议
- 可以使用更清晰的代码风格,例如使用更具描述性的变量名,并添加注释解释代码的功能和逻辑。
- 可以使用更安全的数据类型,例如使用size_t类型存储数组长度。
- 可以使用错误处理机制,例如使用errno和perror函数来处理网络错误。
- 可以使用更强大的数据解析工具,例如使用JSON库来解析数据。
- 可以使用更完善的线程管理机制,例如使用pthread_mutex和pthread_cond来保证线程安全。
总结
这段代码展示了使用C语言实现客户端程序,接收来自服务器的数据,解析数据并进行相应处理,以及构建好友系统功能。代码中还涉及到了一些C语言编程的基本知识,例如字符串处理、网络编程、线程管理等。**
原文地址: https://www.cveoy.top/t/topic/bXQa 著作权归作者所有。请勿转载和采集!