1、比如接收一个客户100字节的数据包,但WSARecv只收到50字节,是不是需要再投递一个WSARecv来接收剩余50字节?2、如上,有什么好的方案把两个包组成一个包.
struct SOCKET_CONTEXT
{
   char szInBuffer[8192];
   CCriticalSection m_ContextLock;
   ...............  
};
这样好像可以,但不知道单个套接字接收顺序会不会乱呢?还有假如有5000个客户,那不是有5000个锁了?好像有点太多了吧!大家给说说下实现思路吧

解决方案 »

  1.   

    1,是的。tcp 是数据流,不是数据包,发送时候的一个包或者两个包,到了接收端可能会变成4,5个,或者2个包被合成了一个。这些都是正常的。
    所以,tcp通讯的时候,需要自己制定一个通信协议,在每个包的最前面添加当前包的总长度。2,5000个锁,5000个客户端,小意思啦。
    =========广告签名==============
    网上化妆品专卖小店
    青春妆坊
    http://shop33712512.taobao.com
    =========广告签名==============
      

  2.   

    1、比如接收一个客户100字节的数据包,但WSARecv只收到50字节,是不是需要再投递一个WSARecv来接收剩余50字节?
    >>必须再次投递 WSARecv 接收剩余的50字节。
      

  3.   

    1、比如接收一个客户100字节的数据包,但WSARecv只收到50字节,是不是需要再投递一个WSARecv来接收剩余50字节?
    >>必须再次投递 WSARecv 接收剩余的50字节。
    ==========================
    真的吗?
    如果真的需要再投一次的话,那么我两次的不同数据岂不是要进行重组成一个完整的数据包了?
      

  4.   

    struct SOCKET_CONTEXT
    {
       char szInBuffer[8192];
       CCriticalSection m_ContextLock;
       ...............  
    };这里再加一个有效数据长度的标志,比如长度是len,那么每次WSARecv(szInBuffer+len)。
    收到了数据就 len+=data_len , 等到收到了完整的一个整个数据包的时候再做处理。
    这样做有个限制,就是数据包最大只能8192字节。对于一般的网游server程序来说,这样的数据包最大长度限制已经足够用了。==========广告签名============
    http://shop33712512.taobao.com
    淘宝店,专卖化妆品、自家蜂产品
    ==========广告签名============
      

  5.   

    1.当然。
    2.TCP是不会乱序的。
    3.锁的粒度得控制好。