持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
QT开发友友们,你们在做TCP通讯开发时,是喜欢用Qt自带的呢?还是喜欢用C++方法呢?
自毕业以来就开始做C++开发,到现在已经有6年,目前Qt开发做了3年了,说实话,对于底层开发来讲,我还是喜欢用纯C++的内容。
今天我们来讲一讲在使用TCP服务端功能时,多对一数据如何处理的问题
在进行socket通讯时,一般情况下,客户端与服务器的对应关系是一对多。
在这时候,最容易出现错误:
1:多个客户端同时发数据时,该如何处理?
2:同一个客户端不断下发数据,如何保证数据的完整性?
在很多面试情况下会问你,如果数据量过大时,你会建造数据池吗?或者会问你,你怎么处理数据?
问题1:
在服务器这端,想要每个客户端的数据都能被处理,需要对每个客户端的数据进行分别处理,假设这里采用vector容器的方式存储。
容器中存储的是当前客户端的详细信息(根据项目而定)
我们如何判断是哪个客户端发过来的数据呢?
此时,我们需要在容器中存储与客户端相连接的线程ID,注意:一定是线程ID,而不是线程句柄!!
当匹配上合适的线程ID后,再进行数据处理。
为什么要使用线程ID?
当某个客户端掉线时,需要删除掉对应的数据信息。假设掉线之后立马又有新的连接,服务端创建与客户端的线程连接,此时线程句柄很大几率情况下是相同的!(这是我在程序中掉过得坑,希望大家注意了~)
问题2:
服务端在处理数据时,属于多线程处理,为了保持数据的完整性,在这里,最常用的方法就是加锁。
因为都是要给同一个容器进行操作,避免不了数据容易错乱。为了减少错误出现,采用了互斥加锁机制。
C11的用法,摒弃了C++最初的EnterCriticalSection
、LeaveCriticalSection
方法,采用了std::lock_guard<std::mutex> mutx(m_mutex);
以上两个问题是我们在做服务端数据处理时最容易出错的地方了
我是中国好公民st,一名C++开发程序猿~