怎么接受长度变化的数据包?
视频服务器端有每秒5k左右的数据包要向客户端发送,
在客户端怎么接受这些长度不等的数据包??只有服务器端才知道每一个数据包的大小

解决方案 »

  1.   

    ye, if socket is TCP, the normal protocol has one field to set packet length
      

  2.   

    就像 yhqs540(半夜3点钟) 说的
      

  3.   

    包首加一个固定长度的字段标识该包的长度即可May you succeed!
      

  4.   

    视频应该是客户方吧.结构体
    struct
    {
        int 包长;
        char 包体[];
    }
      

  5.   

    象 wqs_qiu_shi(美丽心情) 那样 解析的时候先解析出包长,也就是数据包的前四个字节 然后根据包长解析出包体
      

  6.   

    视频数据是有一个header是bitmapinfoheader结构的,这个header是40个字节,该结构
    中指明了其后的视频数据的大小,难道每次发送都分开发送,向发送视频头40个字节,
    再发送视频数据???是不是这样的??
    例如每一帧视频分开发送,先发送40个视频字节的头部,再发送视频数据??是这样的么??
      

  7.   

    head+body的方法,可是接收时怎么办呢?先收head再收body吗?可是我这么用的,就是有点问题,我用的是MFC中的CSocket来写的,我的问题在
    http://community.csdn.net/Expert/topic/3098/3098417.xml?temp=.5185816
    请各位好心人帮我看看!多谢了?
      

  8.   

    我用socket传输视频数据,服务器端负责不断发送捕捉到的视频数据,
    每一帧的视频由40个字节的视频头部(包含了视频数据的大小)加上其后可变长度
    的视频数据,
    客户端负责接受和播放数据,我是用socket api来写的,
    但是客户端只接受了一会儿就死掉了,不知道是怎么回事???
    而服务器端还是不断发送数据,怎么解决,请大家帮忙,我狂散分客户端只负责接受我是这样的:
    for(;;)
    { TotalDataRece =0; //总共已经接受到的数据
    EachDataRece = 0; //每次实际接受到的数据
    EachDataToRead = 0; //每次需要读取的数据
    if((TotalDataRece = recv(recesock, pData, 1024, 0)) <0)
    {
    int a = GetLastError();
    sprintf(szBuf, "WinSock receive error code : %d", WSAGetLastError());
    AfxMessageBox(szBuf);
    closesocket(recesock);
    return -1;
    }
    memcpy(pPlayInfo, pData, 40);
    //接受数据的前40个字节包含了每一视频帧的信息,包括视频数据的大小
    dSize = pPlayInfo->biSizeImage; //每一帧视频数据的大小
    if(dSize == 0)
    {
    AfxMessageBox("receive error !");
    return -1;
    }
    len = dSize + 40; //每一帧的总共大小,视频头+视频数据
    while (TotalDataRece < len)
    {
    EachDataToRead = min(1024, len-TotalDataRece);
    //每一帧的数据量len在4k-10k之间大小不等。
    if((EachDataRece = recv(recesock, pData+TotalDataRece, EachDataToRead, 0))<0)
    {
    int a = GetLastError();
    sprintf(szBuf, "WinSock receive error code : %d", WSAGetLastError());
    AfxMessageBox(szBuf);
    closesocket(recesock);
    return -1;
    }
    TotalDataRece += EachDataRece; }
    VideoPlayback(pData); //播放收到的每一个视频帧,另外一个函数,

    这是程序的客户端,只能接受大概4-5秒钟,就停在哪儿了,不能正确播放,
    而服务器端还在发送数据,这个是怎么回事,请大侠不吝赐教
      

  9.   

    chang长度在视频头信息结构里头有啊,也就是pPlayInfo里头的biSizeImage