关于如何构建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,请问字节大小如何处理,还有补零的那个怎么处理呢?
[其他解释]
我也不想这么麻烦,但是对方的接口是那样的,对方接收到数据包的时候就是按照那样的字段对应的字节解包分析,然后回传数据的,如果用nsstring,请问字节大小如何处理,还有补零的那个怎么处理呢?
[其他解释]
我也不想这么麻烦,但是对方的接口是那样的,对方接收到数据包的时候就是按照那样的字段对应的字节解包分析,然后回传数据的,如果用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];
。。。
[其他解释]
请帮忙看看为什么我无法把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];