iPhone客戶端與服務器間粘包問題解決代碼實現案例
作者:佚名
iPhone客戶端與服務器間粘包問題解決代碼實現案例是本文要介紹的內容,如果您的iPhone App要與服務器交換數據,服務器連續發來兩個消息時就可能出現粘包的情況:一號消息準確接收到了,但二號消息接收的不完整。
iPhone客戶端與服務器間粘包問題解決代碼實現案例是本文要介紹的內容,如果您的iPhone App要與服務器交換數據,服務器連續發來兩個消息時就可能出現粘包的情況:一號消息準確接收到了,但二號消息接收的不完整。你可以嘗試通過CocoaChina論壇的這篇帖子提供的代碼解決iPhone客戶端與服務器間粘包問題。
- void CNetClient::HandleMsg( char *buf ,int nSize )
- {
- m_nRecvByteCount += nSize;
- if( m_RecvTimer.GetMilliseconds( ) >= 1000 )
- {
- // 保存最近十次的網絡包流量大小
- m_RecvByte.AddToTail( m_nRecvByteCount );
- if( m_RecvByte.Count( ) > 10 )
- m_RecvByte.Remove( 0 );
- m_nRecvByteCount = 0;
- m_RecvTimer.Start( );
- }
- m_PackBuffer.Put( buf,nSize);
- int packsize=0;
- int bufsize=m_PackBuffer.TellPut() - m_PackBuffer.TellGet();
- while ( TRUE )
- {
- PACKET_COMMAND *pPack = ( PACKET_COMMAND *)m_PackBuffer.PeekGet( );
- if (pPack)
- {
- // 查看包頭是否完整
- if( bufsize<PACKET_HEAD_SIZE)
- {
- break;
- }
- packsize=pPack->GetSize();
- // 查看是否是完整的網絡包
- if( bufsize<packsize )
- {
- break;
- }
- if (!packsize || packsize>sizeof(PACKET_COMMAND))
- {
- m_PackBuffer.SeekGet(SEEK_HEAD,0 );
- m_PackBuffer.SeekPut(SEEK_HEAD,0 );
- break;
- }
- PACKET_COMMAND pack;
- m_PackBuffer.Get( &pack, packsize);
- HandlePacket(&pack,packsize);
- bufsize = m_PackBuffer.TellPut() - m_PackBuffer.TellGet();
- if (!bufsize)
- {
- m_PackBuffer.SeekGet(SEEK_HEAD,0);
- m_PackBuffer.SeekPut(SEEK_HEAD,0);
- break;
- }
- }
- }
- if ( m_PackBuffer.TellGet() == m_PackBuffer.TellPut() )
- {
- m_PackBuffer.SeekGet(SEEK_HEAD,0);
- m_PackBuffer.SeekPut(SEEK_HEAD,0);
- }
- }
小結:iPhone客戶端與服務器間粘包問題解決代碼實現案例的內容介紹完了,希望通過本文的學習能對你有所幫助!
責任編輯:zhaolei
來源:
starming社區