Takin

Takin

1个粉丝

41

问答

0

专栏

0

资料

Takin  发布于  2014-10-10 15:32:25
采纳率 0%
41个问答
3270

UDP接收的问题

 
请教下诸位,我遇到一个问题:
一个UDP接收函数,在ubuntu服务器上运行是正常的,
我将其入到海思平台跑,老是丢包,
程序一样的
我来回答
回答3个
时间排序
认可量排序

Takin

1个粉丝

41

问答

0

专栏

0

资料

Takin 2014-10-10 15:33:13
认可0
代码如下:[code]
void RevcProcess(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
    int n;
    socklen_t len;
    char buf[MAXLINE];
        int recvCount = 0;
       
    FILE *fSave = fopen("./Save.h264","wb+");
    if (fSave == NULL)
        {
                printf("open file failed\n");
                return;
        }
        FILE *fSaveID = fopen("./SaveID.txt","wb+");
        if (fSaveID == NULL)
        {
                printf("open file failed\n");
                return;
        }
        char Idbuf[2];
        memset(&Idbuf,0,sizeof(Idbuf));
       
        unsigned char dataHead[1];
        memset(&dataHead,0,sizeof(dataHead));

        unsigned char bBeginSaveFlag = 0;
        unsigned char bTypeChoseFlag = 0;

    while(1)
        {
            //usleep(20000);
            memset(&buf,0,sizeof(buf));
                recvCount = recvfrom(sockfd,buf,sizeof(buf),0, pcliaddr,&len);
                if (recvCount > 0)
                {
#if 1
                        printf("%d, %d \n",buf[2],buf[3]);
            //fprintf(fSaveID, "%d ,%d \n", buf[2], buf[3]);
            //fflush(fSaveID);

#else
                        //这个动作是丢掉之前没用的部分帧。
                        if (bBeginSaveFlag == 0)
                        {               
                                if ((buf[12]&0x1f) == 0x07)//程序最开始接收部分
                                {                                       
                                        bBeginSaveFlag = 1;
                                        fwrite(headBuf,sizeof(headBuf),1,fSave);
                                        //fflush(fSave);                     
                                        //从接受的buf的第13个开始。
                                        fwrite(buf+12,recvCount-12,1,fSave);
                                        //fflush(fSave);
                                        //整包写完,写入下一个的头
                                        fwrite(headBuf,4,1,fSave);
                                     fflush(fSave);
                                }else{
                                        recvCount = 0;                                       
                                }
                        }else{
                                int switchChar = buf[12]&0x1f;
                                switch(switchChar)
                                {
                                case 1:
                                case 5:
                                case 7:
                                case 8:
                                case 6:
                                        //printf("save whole package\n");
                                        fwrite(buf+12,recvCount-12,1,fSave);//第13个
                                        //fflush(fSave);
                                        //memset(&buf,0,sizeof(buf));
                                        fwrite(headBuf,4,1,fSave);
                                        fflush(fSave);
                                        break;
                                case 28:                                       
                                        {                                                       
                                                if (bTypeChoseFlag == 0)
                                                {
                                                        //这个只需要一次!!
                                                        dataHead[0] = (buf[12] & 0xe0) | (buf[13] & 0x1f);
                                                        fwrite(dataHead,1,1,fSave);//第14个
                                                        fflush(fSave);
                                                        bTypeChoseFlag = 1;
                                                }
                                                if ((buf[1]&0x80) == 0x80 )//整包
                                                {
                                                        fwrite(buf+14,recvCount - 14,1,fSave);//第15及其以后
                                                        //fflush(fSave);
                                                        fwrite(headBuf,4,1,fSave);
                                                        fflush(fSave);

                                                        bTypeChoseFlag = 0;
                                                }
                                                else if((buf[1]&0x80) == 0x00)
                                                {                                       
                                                        fwrite(buf+14,recvCount - 14,1,fSave);
                                                        fflush(fSave);
                                                }
                                                break;
                                        }
                                default:
                                        break;
                                }
                        }
                #endif                       
                }
        }
        fclose(fSave);
        fclose(fSaveID);
}
[/code]

david

41个粉丝

368

问答

253

专栏

229

资料

david 2014-10-10 16:06:20
认可0
1,UDP 丢包是正常的,比如网络环境,处理器速度都可能造成丢包。这是和TCP的区别,如果要增加其可靠性,必须要有应答机制,比如client发 A ,Server收到A应答B, Client收到B知道自己发的A收到了,再发下一包。
2,其次我看你程序里面没有这种处理机制,
3, 如果丢一包或者丢几个字节,你这个还有用么?    int switchChar = buf[12]&0x1f; if ((buf[12]&0x1f) == 0x07)//程序最开始接收部分,像这个地方要做个搜索算法吧。buf[12]你怎么确定buf[12]

Takin

1个粉丝

41

问答

0

专栏

0

资料

Takin 2014-10-21 20:14:36
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=8354&ptid=3936]david 发表于 2014-10-10 16:06[/url]
1,UDP 丢包是正常的,比如网络环境,处理器速度都可能造成丢包。这是和TCP的区别,如果要增加其可靠性,必 ...[/quote]

谢谢版主,
有个地方不是很理解
您说的 做个搜索算法是指?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区