免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4103 | 回复: 8
打印 上一主题 下一主题

[C++] 关于如何处理socket解包的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-14 11:25 |只看该作者 |倒序浏览
请教大家一个问题:


交易所行情业务场景: 服务器向客户端定时发送数据包,数据包格为: 包头 + 数据体 。 包头为字符串明文,数据体为FAST编码串。其中包头类似于:"8=FIX 9=VER  10=1523" ,包头中10=后面的内容用来表示数据体的数据大小(数据大小不固定)。客户端接收并解码。



问题: 使用两个线程处理时,会有 buffer is too small的现象,目前判断是临界锁影响了recv而导致,以下是客户端的接收线程的代码:
void recvMsg{
                int recvbuflen = 512;
                char recvbuf[512];
                int iResult;               
                memset(recvbuf,0,sizeof(char)*512);
                do {
       
                        iResult = recv(sockClient, recvbuf, recvbuflen, 0);
                        sRecStr.assign(recvbuf) ;
                        pMsgTexts.MsgText = sRecStr ;
                        EnterCriticalSection(&FMsgLock);
                        try
                        {
                                FMsgList.push_back(pMsgTexts);
                                FMsgCount++;       
                                LeaveCriticalSection(&FMsgLock) ;         
                        }
                        catch(...)
                        {

                        }

                } while (iResult > 0);

}

以下是业务处理线程的代码


     void   proceMsg{
        EnterCriticalSection(&FMsgLock);
        if (!FMsgList.empty())
        {                         
                std::copy(FMsgList.begin(), FMsgList.end(), std::back_inserter(aList));
                FMsgList.clear();
        }

        LeaveCriticalSection(&FMsgLock);

        if (aList.size() == 0 )
        {
                Sleep(50);
                return ;
        }

    dosomething(aList) ;
}

请大家出个主意,怎么样处理比较好?谢谢!

论坛徽章:
0
2 [报告]
发表于 2016-07-14 22:47 |只看该作者
这么有质量的问题,居然没人回复?

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
3 [报告]
发表于 2016-07-17 15:38 |只看该作者
请问交易所的工作机会哪里找的??

估计不少屌丝心态跟我一样的,没钱咱干毛的活啊

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
4 [报告]
发表于 2016-07-18 11:11 |只看该作者
请问交易所的工作机会哪里找的??

论坛徽章:
10
CU大牛徽章
日期:2013-09-18 15:20:48程序设计版块每日发帖之星
日期:2016-07-21 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:01技术图书徽章
日期:2014-10-14 16:00:43天蝎座
日期:2013-09-27 17:41:29CU大牛徽章
日期:2013-09-18 15:21:17CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:20:58每日论坛发贴之星
日期:2016-07-21 06:20:00
5 [报告]
发表于 2016-07-18 16:06 |只看该作者
长包,没收完,怎么解?收的时候你得保证收完了,再给消费者.

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
6 [报告]
发表于 2016-07-22 09:54 |只看该作者
buffer 搞大一点

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
7 [报告]
发表于 2016-07-24 10:12 |只看该作者
或者消费者在解包的时候要等到包体完整再处理。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2016-07-24 20:23 |只看该作者
本帖最后由 yulihua49 于 2016-07-24 20:38 编辑
cjfeii 发表于 2016-07-24 10:12
或者消费者在解包的时候要等到包体完整再处理。

对。先把包收完整,通过队列发到处理线程。使用条件锁构建生产者~消费者模型。

UDP就只能这样。
TCP可以采用每个连接一个线程的方式,处理比较简单。如果嫌线程太多,可采用线程池或协程技术。

论坛徽章:
0
9 [报告]
发表于 2016-07-31 19:25 |只看该作者
很好的建议,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP