iPhone客户端与服务器间粘包问题解决代码实现案例

移动开发 iOS
iPhone客户端与服务器间粘包问题解决代码实现案例是本文要介绍的内容,如果您的iPhone App要与服务器交换数据,服务器连续发来两个消息时就可能出现粘包的情况:一号消息准确接收到了,但二号消息接收的不完整。

iPhone客户端服务器间粘包问题解决代码实现案例是本文要介绍的内容,如果您的iPhone App要与服务器交换数据,服务器连续发来两个消息时就可能出现粘包的情况:一号消息准确接收到了,但二号消息接收的不完整。你可以尝试通过CocoaChina论坛的这篇帖子提供的代码解决iPhone客户端与服务器间粘包问题。

  1. void CNetClient::HandleMsg( char *buf ,int nSize )  
  2. {  
  3.         m_nRecvByteCount += nSize;  
  4.         if( m_RecvTimer.GetMilliseconds( ) >= 1000 )  
  5.         {  
  6.             // 保存最近十次的网络包流量大小  
  7.             m_RecvByte.AddToTail( m_nRecvByteCount );  
  8.             if( m_RecvByte.Count( ) > 10 )  
  9.                 m_RecvByte.Remove( 0 );  
  10.             m_nRecvByteCount = 0;  
  11.             m_RecvTimer.Start( );  
  12.         }  
  13.     m_PackBuffer.Put( buf,nSize);  
  14.  
  15.     int packsize=0;  
  16.  
  17.     int bufsize=m_PackBuffer.TellPut() - m_PackBuffer.TellGet();  
  18.     while ( TRUE )  
  19.     {  
  20.         PACKET_COMMAND *pPack = ( PACKET_COMMAND *)m_PackBuffer.PeekGet( );  
  21.         if (pPack)  
  22.         {  
  23.                         // 查看包头是否完整  
  24.                         if( bufsize<PACKET_HEAD_SIZE)  
  25.                         {  
  26.                             break;      
  27.                         }  
  28.                         packsize=pPack->GetSize();  
  29.                         // 查看是否是完整的网络包  
  30.                         if( bufsize<packsize )  
  31.                         {  
  32.                             break;      
  33.                         }  
  34.           
  35.                 if (!packsize || packsize>sizeof(PACKET_COMMAND))  
  36.                 {  
  37.                     m_PackBuffer.SeekGet(SEEK_HEAD,0 );  
  38.                     m_PackBuffer.SeekPut(SEEK_HEAD,0 );  
  39.                     break;  
  40.                 }  
  41.           
  42.                         PACKET_COMMAND pack;  
  43.                 m_PackBuffer.Get( &pack, packsize);  
  44.                 HandlePacket(&pack,packsize);  
  45.           
  46.                 bufsize = m_PackBuffer.TellPut() - m_PackBuffer.TellGet();  
  47.                 if (!bufsize)  
  48.                 {  
  49.                     m_PackBuffer.SeekGet(SEEK_HEAD,0);  
  50.                     m_PackBuffer.SeekPut(SEEK_HEAD,0);  
  51.                     break;  
  52.                 }  
  53.         }  
  54.     }  
  55.     if ( m_PackBuffer.TellGet() == m_PackBuffer.TellPut() )  
  56.     {  
  57.         m_PackBuffer.SeekGet(SEEK_HEAD,0);  
  58.         m_PackBuffer.SeekPut(SEEK_HEAD,0);  
  59.     }      

小结:iPhone客户端服务器间粘包问题解决代码实现案例的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: starming社区
相关推荐

2010-05-20 10:31:37

IIS服务器

2021-01-13 10:18:29

SocketNetty粘包

2009-09-17 16:38:02

WSUS服务器

2019-08-28 15:19:15

PythonTCP服务器

2018-12-18 10:47:37

2018-07-17 09:59:10

PythonUDP服务器

2010-12-31 16:31:08

服务器常见问题

2010-05-20 13:48:17

IIS服务器

2014-01-17 15:23:55

Nagios

2024-02-22 13:47:40

2009-10-28 11:27:49

linux服务器安全

2010-05-17 15:27:34

IIS服务器

2009-08-18 12:51:19

服务器+客户端

2011-06-09 10:51:26

Qt 服务器 客户端

2011-08-18 16:03:34

iPhone上传图片

2010-05-20 11:06:01

IIS服务器

2009-12-25 10:47:17

DNS服务器

2009-09-16 16:09:41

NIS服务器客户端NIS

2018-12-19 10:31:32

客户端IP服务器

2009-06-10 16:25:02

点赞
收藏

51CTO技术栈公众号