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

在上一文档中我们已经建立好了一个链式结构用于存储用户信息,这样我们就可以开始建立P2P的服务功能了,首先我们先建两个基础函数,即注册用户和登录函数,注册函数是将用户的基本资料进行注册,登录函数则是将用户信息与链表中的数据进行比较,查找出匹配的用户资料,完成登录,登录后前端会得到一个rt_code用户以后就可以使用这个rt_code来进行与服务的交互了。

/// <summary>处理用户登录请求并将登录结果返回给用户</summary>
void doUserLogin(lp_message msg)
{	//<username>,<userPassword>,<appCode>,<machineCode>
	char *username = &msg->buff[6];
	char *userPassword = strchr(username, ',');
	userPassword[0] = 0; userPassword += 1;
	char *appCode = strchr(userPassword, ',');
	appCode[0] = 0; appCode += 1;
	char *machineCode = strchr(appCode, ',');
	machineCode[0] = 0; machineCode += 1;
	lp_client client = regClient(username, userPassword, appCode, machineCode, msg->addr.sin_addr, msg->addr.sin_port);
	int addr_len = sizeof(SOCKADDR_IN);
	if (client == NULL) sendto(hServer, "FAILED", 6, 0, (SOCKADDR*)&msg->addr, addr_len);
	else
	{
		char buff[38];
		MoveMemory(buff, "SUCCES", 6);
		MoveMemory(&buff[6], client->runtimeCode, 32);
		sendto(hServer, buff, 38, 0, (SOCKADDR*)&msg->addr, addr_len);
	}
}
/// <summary>处理用户注册信息</summary>
unsigned doRegistUser(lp_message msg)
{	//<username>,<userPassword>,<appCode>,<machineCode>
	lp_client client = (lp_client)malloc(sizeof(_client));
	memset(client, 0, sizeof(_client));
	char *s = msg->buff + 6;
	char *p = strchr(s, ',');
	strncpy(client->userName, s, p - s);	s = p + 1; p = strchr(s, ',');
	strncpy(client->userPassword, s, p - s ); s = p + 1; p = strchr(s, ',');
	strncpy(client->appCode, s, p - s); s = p + 1; 
	strcpy(client->machineCode, s); 
	addClient(client);
	int addr_len = sizeof(SOCKADDR_IN);
	if (client == NULL) sendto(hServer, "FAILED", 6, 0, (SOCKADDR*)&msg->addr, addr_len);
	return 0;
}

建立好这两个函数后,我们就可以将这两个函数放到服务内容中了,即修改receivedMessage函数中的内容,实现根据命令访问这两个函数的功能。

/// <summary>处理接收到的信息</summary>
unsigned WINAPI receivedMessage(void *arg)
{
	lp_message msg = (lp_message)arg;
	if (strncmp(msg->buff, "REGUSR", 6) == 0)doRegistUser(msg);
	if (strncmp(msg->buff, "USRLGN", 6) == 0)doUserLogin(msg);
	printf("Received a [%s] from client %s, string is: %s\n", msg->buff, inet_ntoa(msg->addr.sin_addr), msg->buff);
	//do anything

	free(msg);
	return 0;
}

可以看到我们只是增加了两句话,分别对应msg的前六个字母,即通讯的命令名称,这样我们就可以根据这6个字母的内容找到相应的执行函数了。

通过以上这个机制我们就可以简单实现了P2P的服务响应, 同时建立好了具有良好扩展机制的服务框架。大家可以根据这一模式扩展出适合自己应用的服务函数,同时完成各种应用管理及服务。

这样我们就完成了P2P的服务系统的搭建,用户可以根据自己的需求对这一框架进行调整和补充,完成更加复杂的应用。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值