iOS网络编程TCP/IP应用篇(三)-协议的定制

iOS网络编程TCP/IP应用篇(三)-协议的定制


上面两篇介绍了库的接口及封装,还有个问题就是数据的处理。

问题一:怎么处理通过回调【-(void) onSocket:(AsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag】接收的数据

tcp协议面向字节流,无边界,有序的。根据这些特性我们第一步要做的就是划边界,交互的数据可以都是字符串,在每个结尾处给一个特殊的字符表示结束,这样我们就可以向http一样传json了,短链接这样实现是没问题的,但是如果长连接你还得定义字段说明这块数据的意义,而且会增加流量。在长连接中,我们用结构体来给字节流划出边界,比如:

typedef struct

{

      unsigned char    Account[32];

      unsigned char   Password[32];

}LoginData;//发给服务器

typde struct

{

uint16_t isSuccess;//0-失败 1成功


}LoginRspose;//服务器处理后的返回

如果我知道一块数据时代码登录数据的,我可以直接强制转换成这个结构体,然后再进行处理。

问题来了,我们(服务器端或客户端)如何知道这块数据是代表登录数据了?在1000个字节里怎么确定这快数据的位子?

有序!这快数据绝对是连续的,我们现在把每一个接收能完整处理的或发生的一个完整的数据集叫一个数据包,我们要传送账号字符串我们就增加了一个char数组,现在要知道位字,需要定义个公用包头来解决以上问题,后面将以包头来解析数据。包头最基本的应该包括:

1,包体大小(根据这个取出数据);

2,包体类别(根据这个判断包的功能,我们采用命令的方式来编写代码,采用一级命令和二级命令);

我们将这个缓冲区定义成一下结构体

typedef struct

{

TCP_Head Head;//数据包头

unsigned char Buffer[SOCKET_TCP_PACKET];//数据缓冲

}TCP_Buffer;

SOCKET_TCP_PACKET宏定义缓冲区大小减去包头大小(SOCKET_TCP_BUFFER-sizeof(TCP_Head))。

包头定义为

typedef struct

{

TCP_infomation   Info;

TCP_Eventtype type;

}TCP_Head;

包头里的结构体定义

typedef struct

{

uint8_t  version;//使用消息的版本号

uint16_t  datalenth;//包体数据长度

}TCP_infomation

根据datalenth取出数据大小

typedef struct

{

uint16_t FistCommond;

uint16_t SecondCommond;

}TCP_type

根据命令来判断出这个数据包的功能,去执行哪一段逻辑代码

比如我们规定 F=0,S= 1为登录命令,把数据填充到LoginData中在拷贝到TCP_Buffer结构体中的Buff中,算出包的到大小赋值给datalenth,发发送给服务端,服务器就可以根据这些字段来处理。

包头是服务端和客户端都必须严格遵守的,不符合这个协议的数据都会被丢弃,当然这个协议是根据你项目的需求定制的,比如要加密或带时间戳都可以在包头扩展数据,逻辑协议就是命令的定义及该命令定对应的数据结构体,这是分为2份,(命令可能一样,但是业务数据结构体可能不一样)比如:以上登录命令都可以是0-1,但是客户端发送登录命令必须遵守LoginData协议,服务器处理完0-1后返回的数据必须遵LoginRspose协议。以上是比较简单的,只说出了定义协议的思路,需要根据项目的需求定义出可以扩展,安全的协议。

下一遍我会讲怎么根据协议解析数据(断包,粘包处理)。这里已经有了处理思路,我们定义协议就是为了处理这些问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/********************************************************************/ 本程序仅供学习参考,未经作者允许,不得用于任何商业用途 FuIP专为单片机而定制TCP/IP协议栈,适用于任何8,16,32位单片机 技术论坛:www.fuhome.net/bbs/ FuIP可用于,客户端,服务端,亦可接入fuhome.net 平台进行远程控制 版本:v2.1 2014年10月15日 龙剑奋斗 定期更新,敬请关注——开放,交流,深入,进步 Copyright fuhome.net 未来之家 实验室,让科技融入生活 /********************************************************************/ 键人是从51学习过来的,充分考虑了8位 16位 32位单片机平台特性,采用最易移植写法,因此特别适合任何有单片机基础的网友轻松控制家用电器等,其他扩展fuhome.net 平台会逐步完善。 V1.2版本支持与特性: 1,支持ARP请求、应答(获取目的IP的MAC) 2,支持ICMP_Ping请求,应答(ping命令) 3,支持TCP主动连接,断开,被动连接,断开,数据发送 4,支持UDP发送,接收数据 V1.3 改写了命令识别写法,使用更加简单,效率提高了。(网友yht7891984提出 ) v2.0 更新提示 1、由于单片机RAM完全够用,为了用来方便接入互联网,接收缓冲不再与发送缓冲公用 2、修复TCP连接过程的一些问题,更加兼容不同主机的数据格式。 3、增加了访问外网主机的功能,完善了TCP连接协议,这一点是重大改变。 4、命令识别,发送采用特殊函数,提升了执行效率。 (本demo直接下载到单片机,默认访问百度首页,可以从串口看到数据。 v2.1 更新日志 1、修复了ARP回应bug(网友林海雪原提出) 2、对于TCP/UDP数据不再限制于偶数长度了,奇数偶数均可。 PS.利用fuhome.net网站平台,互联网(电脑,手机)控制单片机,详情fuhome.net/bbs/演示视频教程) 灰常简单,目前实现了远程控制(手机APP和web网页控制,并且带返回信息),传感器数据上传显示,众多爱好者一起在努力开发更多好玩的有趣的扩展 IP采用固定IP, 本机IP:192.168.1.150 默认网关是家庭常用的:192.168.1.1 如果家里的路由器网关是其他如:192.168.0.1,请自行修改网关IP、本机IP 内存分配机制: 以太网首部: EN_Head[14] IP首部: IP_Head[20] UDP伪首部: UDP_False[12] UDP首部: UDP_Head[8] TCP伪首部: TCP_False[12] TCP首部: TCP_Head[20] ARP数据: ARP_Data[28] ICMP数据: ICMP[40] 发送数据缓冲,DATA数据: DATA[200](键人默认长度200,可改) 接收包缓冲(包含ETHERNET头,IP头,TCP/UDP首部) Re_DATA[200](默认长度200,可改,但是为了接收,长度至少TCP>=54,UDP>=42) (本demo占用RAM大约570Byte如果RAM有限可以合并一个使用,减少到360Byte左右,还是要看缓冲你的设定值 因为收发不同时发生)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值