iPhone客戶端與服務(wù)器間粘包問題解決代碼實(shí)現(xiàn)案例
iPhone客戶端與服務(wù)器間粘包問題解決代碼實(shí)現(xiàn)案例是本文要介紹的內(nèi)容,如果您的iPhone App要與服務(wù)器交換數(shù)據(jù),服務(wù)器連續(xù)發(fā)來兩個(gè)消息時(shí)就可能出現(xiàn)粘包的情況:一號(hào)消息準(zhǔn)確接收到了,但二號(hào)消息接收的不完整。你可以嘗試通過CocoaChina論壇的這篇帖子提供的代碼解決iPhone客戶端與服務(wù)器間粘包問題。
- void CNetClient::HandleMsg( char *buf ,int nSize )
- {
- m_nRecvByteCount += nSize;
- if( m_RecvTimer.GetMilliseconds( ) >= 1000 )
- {
- // 保存最近十次的網(wǎng)絡(luò)包流量大小
- 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();
- // 查看是否是完整的網(wǎng)絡(luò)包
- 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);
- }
- }
小結(jié):iPhone客戶端與服務(wù)器間粘包問題解決代碼實(shí)現(xiàn)案例的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!