我现在的程序,除了三种情况,数据量比较大,其他的都是一些小包。
我以前都是用定长数据包做的。
但是现在好像感觉不太适用。
因为大多数的情况数据量比较小,每次都发那么大的数据,好像浪费资源了。
所以考虑用不定长方式,
这样问题就来了,接收端怎么知道发过来的数据包有多长,
如果接收长度添的长了,那么可能收了两个数据包,
如果短了,可能收到的数据包不完整。
怎么做好呢?
是不是一定要事先发一个包头,来通知对方,然后对方再根据包头中的长度来recv数据?
有没有更好的方法?

解决方案 »

  1.   

    常见4K, 比较好, 正好是磁盘一个CLUSTER
      

  2.   

    不定长的好 可以节省空间 包分包头和包体  包头固定,其中一个字段表示包体的长度。这样就可以把一个包拆分开来。/*----------------------包头---------------------*/
    typedef struct _PACKAGE_HEAD
    {
    BYTE m_Version;
    WORD m_Command;
    WORD m_nDataLen;
    }PACKAGE_HEAD;
      

  3.   

    应用层的网络协议一般都不定长的啦
    三种方法:
    一、用UDP,UDP协议是分包发送的,其中已有长度字段;
    二、自定义包头,包头中有长度字段;
    三、自定义一个结束符。这种法子需要把消息内容中含结束符的部分用转义符替换,实现比较困难。
      

  4.   

    联通移动短消息网关协议上是(包长度(DWORD)+包头(定长)+包体(变长))
    小灵通网关协议(包头(包头+包体长度)(定长)+包体(变长))
      

  5.   

    4k不一定是一个簇的大小,必须看用户机器上的实际情况,我的就是512Byte/簇
      

  6.   

    包长度在发送的时候填呀,接收干吗要填?接收的时候先按固定长度收下包头,再根据包头里的长度接收包体。另外,包头和包体可以一起发送,怎么会累赘呢?struct MSGHDR {
        DWORD cbMsgSize;
        // ... other information ...
    };struct MSG1 {
        MSGHDR hdr;
        // ... body1 information ...
    };struct MSG2 {
        MSGHDR hdr;
        // ... body2 information ...
    };