akai1203 发表于 2016-07-14 11:25

关于如何处理socket解包的问题

请教大家一个问题:


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



问题: 使用两个线程处理时,会有 buffer is too small的现象,目前判断是临界锁影响了recv而导致,以下是客户端的接收线程的代码:
void recvMsg{
                int recvbuflen = 512;
                char recvbuf;
                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) ;
}

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

akai1203 发表于 2016-07-14 22:47

这么有质量的问题,居然没人回复?

action08 发表于 2016-07-17 15:38

请问交易所的工作机会哪里找的??

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

cokeboL 发表于 2016-07-18 11:11

请问交易所的工作机会哪里找的??:luya:

tomac_cu 发表于 2016-07-18 16:06

长包,没收完,怎么解?收的时候你得保证收完了,再给消费者.

cjfeii 发表于 2016-07-22 09:54

buffer 搞大一点

cjfeii 发表于 2016-07-24 10:12

或者消费者在解包的时候要等到包体完整再处理。

yulihua49 发表于 2016-07-24 20:23

本帖最后由 yulihua49 于 2016-07-24 20:38 编辑

cjfeii 发表于 2016-07-24 10:12 static/image/common/back.gif
或者消费者在解包的时候要等到包体完整再处理。
对。先把包收完整,通过队列发到处理线程。使用条件锁构建生产者~消费者模型。

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

akai1203 发表于 2016-07-31 19:25

很好的建议,谢谢!
页: [1]
查看完整版本: 关于如何处理socket解包的问题