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提供的流量信息并 ...
一周排行
  • c++學習筆記—c++對txt文件的讀取與寫入
    一.文件的输入输出 头文件fstream定义了三个类型支持文件IO:ifstream从给定 ...
  • 安装mongodb 1.下载,解压mongodb(下载解压目录为/opt) 在/opt目录下执行命令 wget fastdl.mongodb.org/linux/mongodb-linux-x86_.6.4.
  • IOSUI UIScrollView 滾動視圖(1)
    滚动视图多个页面实现的原理 滚动视图位置不变 内容的位置发生改变. 滚动视图的运用1.分页
  • 


    		    LVM+RAID5
    桌面 环境 [[email protected] ~]# uname -a Linux loca
  •     Embedding SQLite in a c programm        The following program demonstrates how to embed SQLite into a c
  • 一.ExtJS1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在.Net.Jav ...
  • 一.PCB布局约束: 1.尺寸规划:PCB大小要合适,PCB太大印制线路长,阻抗增加.太小散热不好,易受干扰. 2.PCB尺寸确定后要确定特殊器件的位置. 3.尽可能缩短高频元器件之间的连线,设法减少他们的分布参数和
  • 关于诸多系统的开放源代码,近来成了大家讨论的热门话题.而今年,微软和Java也加入了其中,这就让数千万的人们更加注意,毕竟,依靠.Net和Java而开发系统程序的人数目就有这么多,他们当然会对系统的开放非常关心. 今
  • 真正遇到该文件丢失大部分问题其实在BOOT.INI文件上. 在安装XP的时候只有GHOST版的XP才会出现此类情况. 为什么? 1.一些品牌机,包括笔记本在内,会有系统还原的功能,该功能垃圾透顶.该系统还原的镜像会放
  •   JavaScript学习09 函数本质及Function对象深入探索   在JavaScript中,函数function就是对象.   JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念.