本帖最后由 oyljerry 于 2011-09-13 10:58:41 编辑

解决方案 »

  1.   

    数据有问题撒,UDP不保证可靠,最好加上验证
      

  2.   

    你一次发多大的包??UDP来的数据包不能保证和发送的顺序是一致的,还有丢包的可能,但是照你说的应该是没丢包你是说的收到的一个包里内容有被修改的??那不大可能啊
      

  3.   

    发送的是这个结构体:
    struct VideoPacketHead
    {
    unsigned char  TotalPackets;
    unsigned char  KeyFrame;
    unsigned short sOffset;
    unsigned short sDataLength;
    unsigned long  lFrameID;
    LONGLONG timeStart;
    LONGLONG timeEnd;
    };
    struct VideoPacket
    {
    VideoPacketHead PacketHead;
    char rawData[1024];
    void my_hton()
    {
    PacketHead.sOffset = htons(PacketHead.sOffset);
    PacketHead.sDataLength = htons(PacketHead.sDataLength);
    PacketHead.lFrameID = htonl(PacketHead.lFrameID);
    }
    void my_ntoh()
    {
    PacketHead.sOffset = ntohs(PacketHead.sOffset);
    PacketHead.sDataLength = ntohs(PacketHead.sDataLength);
    PacketHead.lFrameID = ntohl(PacketHead.lFrameID);
    }
    };
    UDP发送的数据包有最大的限制吗?
    发送的数据包是:1024+sizeof(VideoPacketHead )
      

  4.   

    发送的字节数:
    pMSQ_PACK->msq_head::sDataLength + sizeof(MSQ_HEAD)
    最大是:
    1024+sizeof(MSQ_HEAD),
    但很明显,上面没有达到最大字节数嘛
      

  5.   

    UDP每包不要超过1500字节
    所以视频发送时要先分包
    收到时再重组
    有可能会丢掉其中一小包,要求重发,或者把这一帧都丢掉
    还有可能后发先到
    要注意的事情还很多,任重道远啊建议把每一帧分成多包,每包加个序号,每帧也有序号,收到时用链表保存,再重组。
    rtp协议就是解决这种情况的,不过刚开始看起来有点累,自己写一个算了。
      

  6.   

    从服务器端和客户端各抓UDP包,看看是否都被修改,
    1.如果服务器发出的包是正确的,但客户端收到有问题,检查中间路由器防火墙啥的。
    2.如果服务器端发出的包已经被修改,查看程序,如果100%确保转发程序没问题,看服务端网络相关设置等。