关于如何处理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) ;
}
请大家出个主意,怎么样处理比较好?谢谢!
这么有质量的问题,居然没人回复? 请问交易所的工作机会哪里找的??
估计不少屌丝心态跟我一样的,没钱咱干毛的活啊 请问交易所的工作机会哪里找的??:luya: 长包,没收完,怎么解?收的时候你得保证收完了,再给消费者. buffer 搞大一点 或者消费者在解包的时候要等到包体完整再处理。 本帖最后由 yulihua49 于 2016-07-24 20:38 编辑
cjfeii 发表于 2016-07-24 10:12 static/image/common/back.gif
或者消费者在解包的时候要等到包体完整再处理。
对。先把包收完整,通过队列发到处理线程。使用条件锁构建生产者~消费者模型。
UDP就只能这样。
TCP可以采用每个连接一个线程的方式,处理比较简单。如果嫌线程太多,可采用线程池或协程技术。 很好的建议,谢谢!
页:
[1]