请教,请大家指点下面的这个函数的作用是什么?? 怎么改写可以更好?

wang7890 2009-03-31 10:11:57
bool CExchangeManager::ProcessMessage (const char* pStrMsg, const int& nBuflen)
{
bool bOK(false);
short nMsgLength = 0;
int bufferRead = 0;

if (m_bPartMessage)
{
int nToCopy = 0;
int nBuffRemainingSize = MAX_EXCH_MSG_SIZE - m_nSizeOfPartMessage;
nToCopy = (nBuflen < nBuffRemainingSize ? nBuflen : nBuffRemainingSize);

if (((nToCopy + m_nSizeOfPartMessage) > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "Part+Remainder > buffer size (Pt: %d, Rm: %d)", m_nSizeOfPartMessage, nToCopy);
mDiagnostics.PrintInformational(InfoMsg);
}

memcpy(&m_cMessageBuffer[m_nSizeOfPartMessage], pStrMsg, nToCopy);
if (m_nSizeOfPartMessage+nBuflen > S_MSG_HEADER_SIZE)
{
nMsgLength = ntohs(*((short*)&m_cMessageBuffer[1])) + 3;
if (nMsgLength > nBuflen + m_nSizeOfPartMessage)
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage=true;
return true;
}
else
{
m_bPartMessage = false;
char TempBuffer[MAX_EXCH_MSG_SIZE];
memset(TempBuffer, 0, sizeof(TempBuffer));
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "nMsgLength > buffer size (nMsgLength: %d)", nMsgLength);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(TempBuffer, m_cMessageBuffer, nMsgLength);
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG");//%d: ", m_nMsgIndex);
_writeMsgToBinaryFile(TempBuffer, nMsgLength, strMsgIndex);
}
bOK = _procMsg(TempBuffer[0], nMsgLength, TempBuffer);
pStrMsg = pStrMsg + (nMsgLength - m_nSizeOfPartMessage);
bufferRead = nMsgLength - m_nSizeOfPartMessage;
m_nSizeOfPartMessage= 0;
}
}
else
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage = true;
return true;
}
}

while (bufferRead < nBuflen)
{
if (nBuflen-bufferRead < S_MSG_HEADER_SIZE)
{
m_nSizeOfPartMessage = nBuflen - bufferRead;
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "part message size > buffer size (SizeOfPrtMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg, m_nSizeOfPartMessage);
m_bPartMessage = true;
bufferRead += m_nSizeOfPartMessage;
break;
}
else
nMsgLength = ntohs(*((short*)&pStrMsg[1])) + 3;


if ((nBuflen-bufferRead < nMsgLength) && (nBuflen-bufferRead > 0))
{
m_nSizeOfPartMessage = nBuflen-bufferRead;
if (m_nSizeOfPartMessage > 0)
{
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Part message> buffer size (SizeOfPrMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg,m_nSizeOfPartMessage);
m_bPartMessage=true;
}
else
m_bPartMessage = false;

bufferRead += m_nSizeOfPartMessage;
bOK = true;
}
else
{
memcpy(m_cMessageBuffer, pStrMsg,nMsgLength);
pStrMsg += nMsgLength;
bufferRead += nMsgLength;
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG"); //%d:", m_nMsgIndex);
_writeMsgToBinaryFile(m_cMessageBuffer, nMsgLength, strMsgIndex);
}
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Size of full message is greater than buffer size (nMsgLength: %d)", nMsgLength);
mDiagnostics.PrintInformational(InfoMsg);
}
bOK = _procMsg(m_cMessageBuffer[0], nMsgLength, m_cMessageBuffer);
}
}
if (theApp.ExchangeThreadActive() && m_bUseExchangeQueue)
CExchangeThread::pExchangeThread->SetExchMsgQReadyForRead();

return bOK;
}
...全文
167 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-03-31
  • 打赏
  • 举报
回复
根据包头,循环读取数据,解析包中的各个字段等...这个首先要去了解这个通信协议的包的结构,作者自己定义了一些结构等
kpman 2009-03-31
  • 打赏
  • 举报
回复
好长
taodm 2009-03-31
  • 打赏
  • 举报
回复
找本《重构:改善既有代码的设计》看了就知道怎么搞了。
lijinfenghust 2009-03-31
  • 打赏
  • 举报
回复
应该是网络程序里面 解除TCP包粘贴的一段代码。TCP数据包无边界性,所以发送方发送一个TCP包,可能接收方只收到一个包。
也有可能发送方发了多个包,接收方收到一个 。等等。

这个函数应该是网络通信里面一个单独的线程,用于拆包。



int nBuffRemainingSize = MAX_EXCH_MSG_SIZE - m_nSizeOfPartMessage;
nToCopy = (nBuflen < nBuffRemainingSize ? nBuflen : nBuffRemainingSize);

品茶 2009-03-31
  • 打赏
  • 举报
回复
“「code=C/C++」「/code」”
品茶 2009-03-31
  • 打赏
  • 举报
回复
代码本来就不少,还不使用“
”。
不想看了。
rainbow_free 2009-03-31
  • 打赏
  • 举报
回复
纯纯的up 太多了
lgccaa 2009-03-31
  • 打赏
  • 举报
回复


//代码贴到代码框里,看起来容易一些,长代码加多些注释

mengde007 2009-03-31
  • 打赏
  • 举报
回复
最好能精瘦点,楼主!
sherrik 2009-03-31
  • 打赏
  • 举报
回复
友情up
梅文海 2009-03-31
  • 打赏
  • 举报
回复
大致的看了一下,基本上是先判断消息是否在消息队列里面,如果是则写入文件并且进行输出,另外还有一些内部调用,没有代码就只能猜了。
  • 打赏
  • 举报
回复
ProcessMessage 一般是用来响应系统的各种消息的。
代码这么长,真不想看
genius_tong 2009-03-31
  • 打赏
  • 举报
回复
sf~
wang7890 2009-03-31
  • 打赏
  • 举报
回复

bool ProcessMessage (const char* pStrMsg, const int& nBuflen)
{
bool bOK(false);
short nMsgLength = 0;
int bufferRead = 0;

if (m_bPartMessage)
{
int nToCopy = 0;
int nBuffRemainingSize = MAX_EXCH_MSG_SIZE - m_nSizeOfPartMessage;
nToCopy = (nBuflen < nBuffRemainingSize ? nBuflen : nBuffRemainingSize);

if (((nToCopy + m_nSizeOfPartMessage) > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "Part+Remainder > buffer size (Pt: %d, Rm: %d)", m_nSizeOfPartMessage, nToCopy);
mDiagnostics.PrintInformational(InfoMsg);
}

memcpy(&m_cMessageBuffer[m_nSizeOfPartMessage], pStrMsg, nToCopy);

if (m_nSizeOfPartMessage+nBuflen > S_MSG_HEADER_SIZE)
{
nMsgLength = ntohs(*((short*)&m_cMessageBuffer[1])) + 3;
if (nMsgLength > nBuflen + m_nSizeOfPartMessage)
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage=true;
return true;
}
else
{
m_bPartMessage = false;
char TempBuffer[MAX_EXCH_MSG_SIZE];
memset(TempBuffer, 0, sizeof(TempBuffer));
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "nMsgLength > buffer size (nMsgLength: %d)", nMsgLength);
//mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(TempBuffer, m_cMessageBuffer, nMsgLength);
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG");//%d: ", m_nMsgIndex);
_writeMsgToBinaryFile(TempBuffer, nMsgLength, strMsgIndex);
}
bOK = _procMsg(TempBuffer[0], nMsgLength, TempBuffer);
pStrMsg = pStrMsg + (nMsgLength - m_nSizeOfPartMessage);
bufferRead = nMsgLength - m_nSizeOfPartMessage;
m_nSizeOfPartMessage= 0;
}
}
else
{
m_nSizeOfPartMessage += nBuflen;
m_bPartMessage = true;
return true;
}
}

while (bufferRead < nBuflen)
{
if (nBuflen-bufferRead < S_MSG_HEADER_SIZE)
{
m_nSizeOfPartMessage = nBuflen - bufferRead;
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg)-1, "part message size > buffer size (SizeOfPrtMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg, m_nSizeOfPartMessage);
m_bPartMessage = true;
bufferRead += m_nSizeOfPartMessage;
break;
}
else
{
nMsgLength = ntohs(*((short*)&pStrMsg[1])) + 3;
}


if ((nBuflen-bufferRead < nMsgLength) && (nBuflen-bufferRead > 0))
{
m_nSizeOfPartMessage = nBuflen-bufferRead;
if (m_nSizeOfPartMessage > 0)
{
if ((m_nSizeOfPartMessage > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Part message> buffer size (SizeOfPrMsg: %d)", m_nSizeOfPartMessage);
mDiagnostics.PrintInformational(InfoMsg);
}
memcpy(m_cMessageBuffer, pStrMsg,m_nSizeOfPartMessage);
m_bPartMessage=true;
}
else
m_bPartMessage = false;

bufferRead += m_nSizeOfPartMessage;
bOK = true;
}
else
{
memcpy(m_cMessageBuffer, pStrMsg, nMsgLength);
pStrMsg += nMsgLength;
bufferRead += nMsgLength;
++m_nMsgIndex;
if (m_bGenerateBinaryMsgFile)
{
CString strMsgIndex;
strMsgIndex.Format("FULL_MSG"); //%d:", m_nMsgIndex);
_writeMsgToBinaryFile(m_cMessageBuffer, nMsgLength, strMsgIndex);
}
if ((nMsgLength > MAX_EXCH_MSG_SIZE))
{
char InfoMsg[512];
_snprintf(InfoMsg, sizeof(InfoMsg) - 1, "Size of full message is greater than buffer size (nMsgLength: %d)", nMsgLength);
mDiagnostics.PrintInformational(InfoMsg);
}
bOK = _procMsg(m_cMessageBuffer[0], nMsgLength, m_cMessageBuffer);
}
}

if (theApp.ExchangeThreadActive() && m_bUseExchangeQueue)
{
CExchangeThread::pExchangeThread->SetExchMsgQReadyForRead();
}

return bOK;
}
zhoulehua 2009-03-31
  • 打赏
  • 举报
回复
对于这么长的代码,是要格式一下。
Jarrys 2009-03-31
  • 打赏
  • 举报
回复
假如你是程序爱好者,就请自己看,一来自己能理解这个函数,二来对你自己的编码能力是一个很好的提高
aaaa3105563 2009-03-31
  • 打赏
  • 举报
回复
学习···
CrazyJeff_Liu 2009-03-31
  • 打赏
  • 举报
回复
LZ阿,救救那些想帮助你的人吧!!毕竟你需要他们帮助!

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧