我们已经建立好一个UDP的服务程序了,下面我们要给这个服务程序添加服务内容了。
其服务内容将根据通讯的客户端请求来进行定义和处理。首先我们再回顾一下通讯内容的定义:
///信息结构的指针型 typedef struct _message *lp_message;///信息结构 typedef struct _message{ union { struct { char buff[1030]; }; struct { char cmd[6]; char rt_code[32]; char data[992]; }; }; SOCKADDR_IN addr;};
通讯内容大致分为三部分,第一个部分为6字节的命令名称,第二部分为32字节的运行码,第三部分为数据区。那么我们的服务内容将根据前6位的命令名称来提供,这需要我们先定义一个服务内容的基本函数结构,未来的其他概念都可以沿用这一格式来进行定义。
void do(lp_message msg){ ... ...}
函数只有一个参数,就是我们上面定义的信息结构的指针。由于我们在接受信息时其客户端信息也是采用这个结构的addr来进行的,也就是说客户端的通讯信息也存储在这一结构中了,这就使得我们可以在函数内完成回送等复杂业务。
我们首先定义一个注册和登录函数,这两个函数是服务的基础,这两个命令不同于其他的命令信息,他们在运行时用户信息尚未建立,因此不存在rt_code的内容,因此我们在处理过程中也不会用到rt_code,我们会直接使用buff来进行处理。
在这里我先做个声明,讲解一下系统安全机制,系统将根据用户的“应用编码”、“设备编码”+“用户名”、“口令”的方式进行验证,系统在验证通过后,将向客户端发送一个rt_code作为今后通讯的入口,这个rt_code在每次登陆后都会重新定义,同时我们还可以设定一个rt_code的有效期,因此,在登录后我们在通讯过程中,只需要提供rt_code就可以完成认证,这将隐含掉用户的其他重要信息,简介的防止了客户信息被泄露,如果基于安全的需要我们还可以采用时间戳技术将时间戳增加到通讯内容中,同时利用这个时间戳对rt_code进行加密处理,我在这里就不在详细描述了,大家可以根据自己的需要对这一机制进行完善和补充,我们这里主要实现这一机制的最简单方式。
系统需要将用户信息,以及rt_code进行缓存,在这里我们使用一种简单的链表结构进行存储,这种结构十分简单,同时支持添加修改和删除,简单便于查找和定位。