Windows平台上实现P2P服务(三)

news/2024/7/5 2:29:06

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们已经建立好一个UDP的服务程序了,下面我们要给这个服务程序添加服务内容了。

其服务内容将根据通讯的客户端请求来进行定义和处理。首先我们再回顾一下通讯内容的定义:

/// <summary>信息结构的指针型</summary>
typedef struct _message *lp_message;
/// <summary>信息结构</summary>
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<command>(lp_message msg)
{... ...
}

函数只有一个参数,就是我们上面定义的信息结构的指针。由于我们在接受信息时其客户端信息也是采用这个结构的addr来进行的,也就是说客户端的通讯信息也存储在这一结构中了,这就使得我们可以在函数内完成回送等复杂业务。

我们首先定义一个注册和登录函数,这两个函数是服务的基础,这两个命令不同于其他的命令信息,他们在运行时用户信息尚未建立,因此不存在rt_code的内容,因此我们在处理过程中也不会用到rt_code,我们会直接使用buff来进行处理。

在这里我先做个声明,讲解一下系统安全机制,系统将根据用户的“应用编码”、“设备编码”+“用户名”、“口令”的方式进行验证,系统在验证通过后,将向客户端发送一个rt_code作为今后通讯的入口,这个rt_code在每次登陆后都会重新定义,同时我们还可以设定一个rt_code的有效期,因此,在登录后我们在通讯过程中,只需要提供rt_code就可以完成认证,这将隐含掉用户的其他重要信息,简介的防止了客户信息被泄露,如果基于安全的需要我们还可以采用时间戳技术将时间戳增加到通讯内容中,同时利用这个时间戳对rt_code进行加密处理,我在这里就不在详细描述了,大家可以根据自己的需要对这一机制进行完善和补充,我们这里主要实现这一机制的最简单方式。

134105_fWCk_2308182.png

系统需要将用户信息,以及rt_code进行缓存,在这里我们使用一种简单的链表结构进行存储,这种结构十分简单,同时支持添加修改和删除,简单便于查找和定位。

 

转载于:https://my.oschina.net/u/2308182/blog/1480088


http://lihuaxi.xjx100.cn/news/250711.html

相关文章

电子学会青少年编程等级考试Python一级题目解析06

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 Python一级题目解析 1、题目[2020.09] 要求&#xff1a; &#xff08;1&…

1234

Foobar? AppScanHeader: AppScanValue/1.2-3 SecondAppScanHeader: whatever转载于:https://blog.51cto.com/xbule/629179

微信小程序反编译

最近公司想做地图业务&#xff0c;但是考虑到数据的重要性&#xff0c;我们就需要从各个角度进行评估&#xff0c;如何保证我们的程序安全&#xff1b;经过长期的调研发现微信小程序是没办法防止别人抓包的&#xff0c;只要连上charles就能随意抓取微信小程序的任意一个接口数据…

uva 10183 How many Fibs?

数学题&#xff1a; 给你一个区间[a,b]在该区间内有多少个费波那列数&#xff08;包括a&#xff0c;b&#xff09;&#xff0c;数据规模达到10^100。 这题的原理很简单&#xff0c;基本没什么算法&#xff0c;其实更偏重于编程能力&#xff0c;需要用到高精度。另外找区间的地方…

python装饰器+迭代器+生成器

1.函数嵌套&#xff1a;在调用一个函数的过程中&#xff0c;调用了其他函数 def f1():x1def f2():print(from f2)f2() f1() 2.名称空间与作用域 a. 名称空间&#xff1a;存放名字与变量值绑定关系的地方 &#xff08;1&#xff09;内置名称空间&#xff1a;在python解释器启动…

电子学会青少年编程等级考试案例:曲奇饼干

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 案例&#xff1a;曲奇饼干 代码 import turtlet turtle.Pen()t.speed(6) t.p…

RabbitMQ镜像队列机制

镜像queue有master节点和slave节点。master和slave是针对⼀个queue而⾔的&#xff0c;⽽不是⼀个node作为所有queue的master&#xff0c;其它node作为slave。⼀个queue第⼀次创建的node为它的master节点&#xff0c;其它node为slave节点。⽆论客户端的请求打到master还是slave最…

mysql从另一张获取数据的方法

方法一 CREATE TABLE tmp AS SELECT a.id FROM t_user t JOIN temp a ON t.email a.email; 方法二 INSERT INTO t_user (id,username,PASSWORD,email,user_type,STATUS) SELECT id,REPLACE(email,,_),PASSWORD,email,0,0 FROM temp; 这两个sql都是从另外一张中获取的数据插入…