博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows平台上实现P2P服务(四)
阅读量:6091 次
发布时间:2019-06-20

本文共 5806 字,大约阅读时间需要 19 分钟。

hot3.png

建立一个链式结构便于存储用户信息,以便今后处理登录和未登录的信息。首先我们建立一个用户信息的结构:

/// 客户端信息结构typedef struct _client *lp_client;/// 客户端信息指针结构typedef struct _client{	char userName[20];		//用户名称	char userPassword[20];	//用户口令	char appCode[20];		//应用编码	char machineCode[32];	//机器码	char runtimeCode[32];	//运行码	struct  in_addr addr;	//网址	u_short port;			//通讯端口	lp_client next;			//链表下一个};

153123_gAAr_2308182.png如图所示,所谓链式结构就是左侧图示的方式,从上面的结构上看,最后那个next就是用于链接的,为了更好的操作这个链接,我们需要建立两个变量来便于操作和处理,这两个变量是根节点和末节点变量。

/// 客户信息列表根节点lp_client rootItem = NULL;/// 客户信息列表末节点lp_client lastItem = NULL;

下面提供一下整个代码,包含查询、增加、删除等操作。

UDPList.h

#pragma once#include "targetver.h"/// 信息结构的指针型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;};/// 客户端信息结构typedef struct _client *lp_client;/// 客户端信息指针结构typedef struct _client{	char userName[20];		//用户名称	char userPassword[20];	//用户口令	char appCode[20];		//应用编码	char machineCode[32];	//机器码	char runtimeCode[32];	//运行码	struct  in_addr addr;	//网址	u_short port;			//通讯端口	lp_client next;			//链表下一个};/// 根据用户名称得到用户信息节点lp_client IndexOf(char* appCode, char * userName);/// 根据用户名称得到用户信息节点lp_client IndexOf(char* appCode, char * userName, char * machineCode);/// 根据运行编码得到用户信息节点lp_client IndexOf(char * runtimeCode);/// 添加一个客户端信息lp_client addClient(char* userName, char* userPassword, char* appCode, char* machineCode);/// 添加一个客户端信息void addClient(lp_client client);/// 一个客户端登录系统lp_client regClient(char * userName, char * userPassword, char * appCode, struct  in_addr addr, u_short port);/// 一个客户端登录系统lp_client regClient(char * userName, char * userPassword, char * appCode, char * machineCode, struct  in_addr addr, u_short port);/// 根据用户名称删除用户信息节点void removeClient(char* appCode, char * userName);/// 从文件缓存中提取客户端列表void loadFromFile(char* filename);/// 将客户端列表写入缓存文件void saveToFile(char* filename);

下面是UDPList.cpp

#include "stdafx.h"#include "UDPList.h"/// 客户信息列表根节点lp_client rootItem = NULL;/// 客户信息列表末节点lp_client lastItem = NULL;void setRuntimeCode(lp_client client){	GUID gid;	CoCreateGuid(&gid);	sprintf(client->runtimeCode, "%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x", gid.Data1, gid.Data2, gid.Data3, gid.Data4[0], gid.Data4[1], gid.Data4[2], gid.Data4[3], gid.Data4[4], gid.Data4[5], gid.Data4[6], gid.Data4[7]);}/// 根据用户名称得到用户信息节点lp_client IndexOf(char* appCode, char * userName){	if (rootItem == NULL)return NULL;	lp_client tmp = rootItem;	while (tmp)	{		if (strcmp(tmp->appCode, appCode) == 0 && strcmp(tmp->userName, userName) == 0)			return tmp;		tmp = tmp->next;	}	return NULL;}/// 根据用户名称得到用户信息节点lp_client IndexOf(char* appCode, char * userName, char * machineCode){	if (rootItem == NULL)return NULL;	lp_client tmp = rootItem;	while (tmp)	{		if (strncmp(tmp->appCode, appCode, 20) == 0 && strncmp(tmp->userName, userName, 20) == 0 && strncmp(tmp->machineCode, machineCode, 32) == 0)			return tmp;		tmp = tmp->next;	}	return NULL;}/// 根据运行编码得到用户信息节点lp_client IndexOf(char * runtimeCode){	if (rootItem == NULL)return NULL;	lp_client tmp = rootItem;	while (tmp)	{		if (strcmp(tmp->runtimeCode, runtimeCode) == 0)			return tmp;		tmp = tmp->next;	}	return NULL;}/// 一个客户端登录系统lp_client regClient(char * userName, char * userPassword, char * appCode, struct  in_addr addr, u_short port){	lp_client result = IndexOf(userName, userPassword);	if (result == NULL)return NULL;	if (strcmp(result->userPassword, userPassword) != 0)return NULL;	result->addr = addr;	result->port = port;	setRuntimeCode(result);	return result;}/// 一个客户端登录系统lp_client regClient(char * userName, char * userPassword, char * appCode, char * machineCode, struct  in_addr addr, u_short port){	lp_client result = IndexOf(appCode, userName, machineCode);	if (result == NULL)return NULL;	if (strcmp(result->userPassword, userPassword) != 0)return NULL;	result->addr = addr;	result->port = port;	setRuntimeCode(result);	return result;}/// 根据用户名称删除用户信息节点void removeClient(char * appCode, char * userName){	if (rootItem == NULL)return ;	lp_client tmp = rootItem;	lp_client parent = NULL;	while (tmp)	{		if (strcmp(tmp->appCode, appCode) == 0 && strcmp(tmp->userName, userName) == 0)		{			if (parent == NULL)rootItem = tmp->next;			else parent->next = tmp->next;			if (tmp->next == NULL)lastItem = parent;			free(tmp);			return;		}		parent = tmp;		tmp = tmp->next;	}}/// 从文件缓存中提取客户端列表void loadFromFile(char * filename){	FILE *fp;	if ((fp = fopen(filename, "rb")) == NULL)	{		printf("cant open the file");		exit(0);	}	lp_client client = (lp_client)malloc(sizeof(_client));	memset(client, 0, sizeof(_client));	while(fread(client, 20 + 20 + 20 + 32, 1, fp) > 0) {		if (rootItem == NULL)rootItem = client;		else lastItem->next = client;		lastItem = client;		client = (lp_client)malloc(sizeof(_client));		memset(client, 0, sizeof(_client));	}	free(client);	fclose(fp);}/// 将客户端列表写入缓存文件void saveToFile(char * filename){	FILE * outfile = fopen(filename, "wb");	if (outfile == NULL)	{		printf("cant open the file");		exit(0);	}	lp_client client = rootItem;	while (client)	{		fwrite(client, 20 + 20 + 20 + 32, 1, outfile);		client = client->next;	}	fclose(outfile);}/// 添加一个客户端信息lp_client addClient(char* userName, char* userPassword, char* appCode, char* machineCode){	lp_client result = IndexOf(userName, userPassword);	if (result != NULL)return result;	result= (lp_client)malloc(sizeof(_client));	memset(result, 0, sizeof(_client));	strcpy(result->userName, userName);	strcpy(result->userPassword, userPassword);	strcpy(result->appCode, appCode);	strcpy(result->machineCode, machineCode);	addClient(result);	return result;}/// 添加一个客户端信息void addClient(lp_client client){	if (rootItem == NULL)rootItem = client;	else lastItem->next = client;	lastItem = client;}

同时函数还实现了文件缓存功能,通过SaveToFile和LoadFromFile来实现。

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

你可能感兴趣的文章
《大公司病》阅读笔记
查看>>
grep命令參数及使用方法
查看>>
都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行使用方法
查看>>
maven手动安装jar到本地仓库
查看>>
Android ActionBar中的下拉菜单
查看>>
浅谈JSON.stringify 函数与toJosn函数和Json.parse函数
查看>>
UML之部署图(Deployment Diagram)
查看>>
【转】Eclipse中查看jar包中的源码
查看>>
数据库索引的作用和优点缺点
查看>>
关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)...
查看>>
自动共享内存管理(转)
查看>>
软件架构学习小结
查看>>
遗传算法入门到掌握(一)
查看>>
html5 canvas结构基础
查看>>
Oracle SQL函数之转换函数
查看>>
Java从零开始学四十七(注解简述)
查看>>
LT和ET模式
查看>>
由一道面试题来了解进程间的通信
查看>>
MySQL索引原理及慢查询优化
查看>>
Swing多线程编程(转)
查看>>