首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Iphone >

关于怎么构建udp数据包数据部分的有关问题

2012-12-25 
关于如何构建udp数据包数据部分的问题现有如下要求:udp数据包数据部分的结构格式如下:字段长度数据类型备

关于如何构建udp数据包数据部分的问题
现有如下要求:
udp数据包数据部分的结构格式如下:

字段       长度         数据类型          备注
identifier 8 Char                      固定为:ABCDEFGH
Length 4 Int                     不足在后面补0
Phonenum 16       Char                     不足在后面补0
Password 16       Char                     不足在后面补0
Command 4  Int                     1001
Sn         4    Int                     命令序列号,由发送端产生,响应端返回时,用于判断该返回是针对哪个命令。
Param不限 Char                     根据命令不同,值也不同
CRC         4       Int                       CRC32校验位

我用的是如下结构体来构建的,不知道对不对

typedef struct  {
    char identifier[8];
    int length;
    char phonenum[16];
    char password[16];
    int command;
    int sn;
    char param[1];
    int crc; 
}udpdata;

给param将要赋值一个字母,所以我建立的为1个字节;如果param为可变的,我该如何创建?
我接着创建了一个udpdata *senddata;
对senddata各个成员采用如下方式赋值的
    senddata=malloc(sizeof(udpdata));
    memset(senddata, 0, sizeof(udpdata));
    memcpy(senddata->identifier, "ABCDEFGH",8);
    memcpy(senddata->phonenum, "12345678900",11);
    memcpy(senddata->password, "123456",6);
    memcpy(senddata->param, param, strlen(param));
    senddata->command=command;
    senddata->sn=1;
    senddata->length=sizeof(*senddata);

    char buf[sizeof(*senddata)];
    memset(buf, 0, sizeof(*senddata));
    memcpy(buf, senddata, sizeof(*senddata));
    CRC *crc=[[CRC alloc] init];
    senddata->crc=[crc udp_crc32: buf        Length: sizeof(*senddata)-4];
CRC,是我写的另一个类,暂时可先不管它的对错。
   
上面有几个字段要求“不足在后面补0”,不知道怎么补?
如果udp数据部分接口创建并赋值好了,那又该如何将其转换为可发送出去的数据呢,比如转换为NSData?里面主要是包含有那个int型的字段,怎么转换,一般转换为什么样的格式。。。。。

菜鸟请教各位了~~~谢谢!十万火急
[最优解释]
这种协议就得逐个字节对,另外补零是针对字符串,整形不可能补零
变长数组需要在协议中指定长度,这种协议的一般格式是 协议类型,数据长度,数据,其中数据还可以再嵌套
[其他解释]


搞这么麻烦,你用用AsyncSocket。直接把nsstring转换为dsdata然后发送就可以了
[其他解释]
我也不想这么麻烦,但是对方的接口是那样的,对方接收到数据包的时候就是按照那样的字段对应的字节解包分析,然后回传数据的,如果用nsstring,请问字节大小如何处理,还有补零的那个怎么处理呢?
[其他解释]

引用:
搞这么麻烦,你用用AsyncSocket。直接把nsstring转换为dsdata然后发送就可以了


我也不想这么麻烦,但是对方的接口是那样的,对方接收到数据包的时候就是按照那样的字段对应的字节解包分析,然后回传数据的,如果用nsstring,请问字节大小如何处理,还有补零的那个怎么处理呢?
[其他解释]
引用:
搞这么麻烦,你用用AsyncSocket。直接把nsstring转换为dsdata然后发送就可以了


我也不想这么麻烦,但是对方的接口是那样的,对方接收到数据包的时候就是按照那样的字段对应的字节解包分析,然后回传数据的,如果用nsstring,请问字节大小如何处理,还有补零的那个怎么处理呢?
[其他解释]
对方的接口可以改不?这也太死板了吧,一点兼容性没有
[其他解释]
引用:
这种协议就得逐个字节对,另外补零是针对字符串,整形不可能补零
变长数组需要在协议中指定长度,这种协议的一般格式是 协议类型,数据长度,数据,其中数据还可以再嵌套


你能够给个示例吗?
[其他解释]
引用:
引用:

这种协议就得逐个字节对,另外补零是针对字符串,整形不可能补零
变长数组需要在协议中指定长度,这种协议的一般格式是 协议类型,数据长度,数据,其中数据还可以再嵌套


你能够给个示例吗?

一般变长数据应该放在结构的最后,这样便于第一次读取出除变长数据之外的所有数据,并且前面结构中要给出变长数据的长度以便第二次读取。所以你的结构大概可以这样:
typedef struct {
  char identifier[8];
  char phonenum[16];
  char password[16];
  int command;
  int sn;
 int crc; 
 int length;//这个长度是指param的长度
  char param[1];
}udpdata;
最后还要注意一下字节对齐的问题。
[其他解释]
引用:
引用:

引用:

这种协议就得逐个字节对,另外补零是针对字符串,整形不可能补零
变长数组需要在协议中指定长度,这种协议的一般格式是 协议类型,数据长度,数据,其中数据还可以再嵌套


你能够给个示例吗?

一般变长数据应该放在结构的最后,这样便于第一次读取出除变长数据之外的所有数据,并且前面结构中要给出变长数据的长度以便第二次读取。所以你……

接口的字段顺序是定义好了的,andriod已经开发出了对应的app,不能够变了;
我想知道的是如何将结构体里的数据转换一下能够通过
[self.sendSocket        sendData:databuf 
                                  toHost:self.hostIP 
                                  port:ServerPort 
                                  withTimeout:-1
                                  tag:senddata->sn];
发送出去;
就是sendData:后面那个参数如何用那个结构体构建
[其他解释]
那个简单:
struct buf;//假设里面已经填好数据
NSData *data = [NSData dataWithBytes:&buf length:buf.length];
。。。
[其他解释]

引用:
那个简单:
struct buf;//假设里面已经填好数据
NSData *data = [NSData dataWithBytes:&buf length:buf.length];
。。。

请帮忙看看为什么我无法把udp数据包发送出去?
部分代码如下:
待发送的数据databuf,服务器地址:self.hostIP,端口两边都采用同一个ServerPort
我机子的ip10.10.27.101,在内网中发送udp
self.sendSocket=[[AsyncUdpSocket alloc] initWithDelegate:self];
[self.sendSocket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
NSError *error=nil;
[self.sendSocket bindToAddress:@"10.10.27.101" port:ServerPort error:&error];
[self.sendSocket receiveWithTimeout:-1 tag:0];
[self.sendSocket sendData:databuf toHost:self.hostIP port:ServerPort withTimeout:-1 tag:senddata->sn];

热点排行