iOS socket 自定义协议

2017-06-01  本文已影响455人  kenewang
/*
 typedef struct NetStruct_twoData
 {
 int header;//包头
 int length;//包总长度
 int cmd;//信号令
 int num;//数据条数
 int dataNum;//字段数
 int dataType_one;//字段类型
 int dataType_two;//字段类型
 int dataLength_one;//字段长度
 int dataLength_two;//字段长度
 int data[50];//字段
 Byte verify;//校验
 Byte version;//版本号
 int tail;//包尾
 */

事例代码(发送一个心跳包):

- (NSData*)heartBeat
{
    unsigned int   header = 0x12345678;
    unsigned int length = (unsigned int)(8*4+2+4);
    unsigned int cmd = 0x00000000;
    unsigned int num = 0x00000001;
    unsigned int datanum = 0x00000001;
    unsigned int dataType_one = 0x00000002;
    unsigned int dataLength_one = 4;
   // 大小端转换
    header = CFSwapInt32BigToHost(header);
    length = CFSwapInt32BigToHost(length);
    cmd = CFSwapInt32BigToHost(cmd);
    num = CFSwapInt32BigToHost(num);
    datanum = CFSwapInt32BigToHost(datanum);
    dataType_one = CFSwapInt32BigToHost(dataType_one);
    dataLength_one = CFSwapInt32BigToHost(dataLength_one);
    
    NSMutableData * contentData = [[NSMutableData alloc]init];
    [contentData appendBytes:&header length:4];
    [contentData appendBytes:&length length:4];
    [contentData appendBytes:&cmd length:4];
    [contentData appendBytes:&num length:4];
    [contentData appendBytes:&datanum length:4];
    [contentData appendBytes:&dataType_one length:4];
    [contentData appendBytes:&dataLength_one length:4];
    [contentData appendBytes:"abcdefghui" length:4];
    
    Byte * dataString = (Byte *)[contentData bytes];
    Byte eox;
    memcpy(&eox, dataString, 1);
    for (NSUInteger i = 1 ; i < contentData.length; i ++) {
        eox = eox^dataString[i];
    }
    [contentData appendBytes:&eox length:1];
    
    
    unsigned int version = 0x01;
    unsigned int tail = 0x87654321;
    
    tail = CFSwapInt32BigToHost(tail);
    
    [contentData appendBytes:&version length:1];
    [contentData appendBytes:&tail length:4];
    
    return contentData;
}

具体调用代码:
结合第三方的GCDAsyncSocket开源代码,保持心跳包

GCDAsyncSocket * _sendSocket;
//创建一个后台队列等待接受数据
 dispatch_queue_t dQueue = dispatch_queue_create("socket queue", NULL);
 if (_sendSocket == nil) {
      _sendSocket  = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dQueue socketQueue:nil];
 }

[_sendSocket writeData:data withTimeout:-1 tag:10];
上一篇下一篇

猜你喜欢

热点阅读