xcode中的udp發送文件函數,分包發送每包8000個字節

-(void) UDP_SendFile:(NSString *) filename tag:(NSInteger) msgtag;

{

    NSString * filepath=[NSTemporaryDirectory() stringByAppendingString:filename];

    NSData * sdata=[[NSData alloc] initWithContentsOfFile:filepath];

    

    Byte *sarr;

    NSData *fdata=[filename dataUsingEncoding:NSUTF8StringEncoding];

    

    int sumpak,curpak;

    

    //分包发送

    int total=sdata.length,curloc,srctotal=sdata.length;

    sumpak=srctotal/8;

    if (srctotal%8==0)

    {

    }

    else

    {

        sumpak=sumpak+1;

    }

    curpak=0;

    curloc=0;

    NSLog(@"总数:%d",total);

    //文件信息头:

    /*    EA EA                                     2

          FILETYPE                                  1

          msgtag1 msgtag2 msgtag3 msgtag4           4

          PAKNUM1 PAKNUM2 PAKNUM3 PAKNUM4           4

          PAKSUM1 PAKSUM2 PAKSUM3 PAKSUM4           4

          DATALEN1 DATALEN2                         2

          filename                                  100

          CHK1 CHK2                                 2

     */

    while (total>8)

    {

        curpak++;

        NSData *pdata=[sdata subdataWithRange:NSMakeRange(curloc,8)];

        sarr=new Byte[8120];

        Byte * bytes;

        sarr[0]=0xea;   //头标记

        sarr[1]=0xea;   //头标记

        sarr[2]=0;      //文件类型

 

        sarr[3]=msgtag/256/256/256;          //文件号

        sarr[4]=msgtag%(256*256*256)/256;

        sarr[5]=msgtag%(256*256)/256;

        sarr[6]=msgtag%(256*256)%256;

 

        sarr[7]=curpak/256/256/256;          //包序号

        sarr[8]=curpak%(256*256*256)/256;

        sarr[9]=curpak%(256*256)/256;

        sarr[10]=curpak%(256*256)%256;

        

        sarr[11]=sumpak/256/256/256;          //总包数

        sarr[12]=sumpak%(256*256*256)/256;

        sarr[13]=sumpak%(256*256)/256;

        sarr[14]=sumpak%(256*256)%256;

        

        Byte *fbytes=(Byte *)[fdata bytes];

        NSUInteger totalf;

        if ([fdata length]>100)

        {

            totalf=100;

        }

        else

        {

            totalf=[fdata length];

        }

        for(int i=0;i<100;i++)

            sarr[17+i]=0;

        

        for(int i=0;i<totalf;i++)

        {

            sarr[17+i]=fbytes[i];

        }

        

        sarr[15]=8/256;

        sarr[16]=8%256;

        int check=0;

        bytes=(Byte *)[pdata bytes];

        for(int i=0;i<8;i++)

        {

            check=check+bytes[i];

            sarr[i+120]=bytes[i];

        }

        sarr[117]=check/256;

        sarr[118]=check%256;

        sarr[119]=0;

        NSData *sdata=[[NSData alloc]initWithBytes:sarr length:8120];

        [udpClient sendData:sdata toHost:serverip port:8009 withTimeout:5 tag:1];

        total=total-8;

        curloc=curloc+8;

        sarr=nil;

        NSLog(@"%d",8);

    }

    if (total>0)

    {

        curpak++;

        NSData *pdata=[sdata subdataWithRange:NSMakeRange(curloc,total)];

        sarr=new Byte[total+120];

        Byte * bytes=(Byte *) [pdata bytes];

        sarr[0]=0xea;   //头标记

        sarr[1]=0xea;   //头标记

        sarr[2]=0;      //文件类型

        

        sarr[3]=msgtag/256/256/256;          //文件号

        sarr[4]=msgtag%(256*256*256)/256;

        sarr[5]=msgtag%(256*256)/256;

        sarr[6]=msgtag%(256*256)%256;

 

        sarr[7]=curpak/256/256/256;          //包序号

        sarr[8]=curpak%(256*256*256)/256;

        sarr[9]=curpak%(256*256)/256;

        sarr[10]=curpak%(256*256)%256;

        sarr[11]=sumpak/256/256/256;          //总包数

        sarr[12]=sumpak%(256*256*256)/256;

        sarr[13]=sumpak%(256*256)/256;

        sarr[14]=sumpak%(256*256)%256;

        

        

        

        sarr[15]=total/256;

        sarr[16]=total%256;

        int check=0;

        Byte *fbytes=(Byte *)[fdata bytes];

        NSUInteger totalf;

        if ([fdata length]>100)

        {

            totalf=100;

        }

        else

        {

            totalf=[fdata length];

        }

        for(int i=0;i<100;i++)

          sarr[17+i]=0;

        

        for(int i=0;i<totalf;i++)

        {

            sarr[17+i]=fbytes[i];

        }

        

        for(int i=0;i<total;i++)

        {

            check=check+bytes[i];

            sarr[i+120]=bytes[i];

        }

        sarr[117]=check/256;

        sarr[118]=check%256;

        sarr[119]=0;

        NSData *sdata=[[NSData alloc]initWithBytes:sarr length:total+120];

        

        [udpClient sendData:sdata toHost:serverip port:8009 withTimeout:5 tag:1];

        NSLog(@"%d",total);

 

    }

 

}

 

更多相关文章
  • 


    		    Xcode中ARC和MRC下文件轉換
    ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic ReferenceCounting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了.该机制在iOS 5/ Mac OS X 10 ...
  • 起因: 在一个项目中,接到用户反馈说其所有客户不能上传文件,都返回失敗.经过排查发现是PHP中的is_uploaded_file函数在捣鬼. 细节分析: 在正常情况下,通过PHP 上传文件 ,需要通过is_uploaded_file函数来判断文件是否是通过 HTTP POST 上传的,这可以用来确保
  • 


    		    轉UNITY3D 遊戲開發之七C# 中的委托、事件、匿名函數、Lambda 表達式
    本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Him
  • 今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由runloop分发的2个函数同时执行呢?进而同时修改同一个变量,产生bug? 我做了以下的测试: - (void)viewDidLoad { [super viewDidLoad]; [self performSelectorOn ...
  • 1.udpclient的初始化  udpClient=[[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:mainQueue];     ud
  • hash2int /** * 计算一个字符串的md5折算成int返回 * @param type $str * @return type */ function hash2int($str) { $md5str = md5($str, true); $one = unpack('l', substr ...
  • 用LNMP环境,在探针里测试发送邮件,失敗了.已经确定mail()函数是开启的. 问题根源 没有安装或启动 sendmail 组件 解决辦法 我是新手,命令不熟,所以写的很详细,老鸟勿喷哦 1.重新安装 sendma
  • 


    		    從零開始學習C語言(一)之讀取文本文件(函數fgets)
    为什么说是从零开始呢,只要是学计算机的都会学C,但那是学校的事了,我都还给老师了.老师对不住啊.您白教我位学生了. 最近开始学习C,原因:上司让我用C写一程序.大体是:通过daemon程序从/proc/net/dev读取并统计流量,通过socket连接在server上读取daemon提供的流量信息并 ...
一周排行
  • 1.必须在vmware中系统的选项卡里选择安装vmware tools 2.然后在系统的光驱里会出现一张VMware tools的光盘 3.进入Ubuntu系统 4.把文件从光盘上拷贝到本地(名字记不到了,自己用ta
  • HDU 5372 Segment Game
    我的内心是几乎崩溃的,感受到了英语渣的悲剧.. 前几次WA没有发现是第i次增加操作.> ...
  • Fedora Core 12 下载地址 Fedora Core 12于上月(2009年11月)中旬已经正式发布,支持当前主流的计算机硬件配置. Fedora是一套从Red Hat Linux发展出来的免费Linux系
  • 废话不说,直接上代码 1 // 2 // CommunityTool.h 3 // SmartCommunity 4 // 5 // Created by chenhuan on 15/9/2. 6 // Copyr
  • linux安装ruby ruby-devel rubygems yum install ruby ruby-devel rubygems 安装bundler gem install bundleror sudo ge
  • document 文挡对象 - JavaScript脚本语言描述 --------------------------------------------------------------------- 注:页面上
  • Java基礎知識強化之IO流筆記56:IO流練習之 登錄注冊IO版
    1.  登录注册IO版的Java项目框架,如下:     2. 具体代码实现: (1)Us
  • 就是把现有文件转移到隔离空间即可 代码如下  private async void CopyDB()        {            StorageFile fage = await ApplicationD
  • [原创]配置管理技术圈QQ群:129489184 配置管理技术圈QQ群:129489184,研究cvs,svn,git,cc等平台配置技术,涉及版本控制,持续集成,自动化构建等! 欢迎各位同学来,来时请自报家门,名片
  • 在Repository模式中,我的Update方法总是无法更新实体,这个非常郁闷,Update方法如下: 1: public virtual void Update(T entity) 2: { 3: try 4: