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/8000;
if (srctotal%8000==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>8000)
{
curpak++;
NSData *pdata=[sdata subdataWithRange:NSMakeRange(curloc,8000)];
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]=8000/256;
sarr[16]=8000%256;
int check=0;
bytes=(Byte *)[pdata bytes];
for(int i=0;i<8000;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:5000 tag:1];
total=total-8000;
curloc=curloc+8000;
sarr=nil;
NSLog(@"%d",8000);
}
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:5000 tag:1];
NSLog(@"%d",total);
}
}