您的位置:首页 > 其它

一个基于Unix套接字的注册登录系统

2016-05-07 23:01 393 查看
2016/5/5

今天,我参考《Unix网络编程-卷1》第5章的TCP回射客户/服务器程序写了一个简单的注册登录系统,其功能如下:(1)注册。客户端向服务器发送个人信息请求注册,服务器查询MySQL数据库以检查该客户是否已存在,若是则禁止注册,并返回“用户已存在,注册失败”的错误信息,否则将新用户信息添加到MySQL数据库,并返回“注册成功”的信息。(2)登录。客户端向服务器发送个人账号和密码等两项信息,服务器查询MySQL数据库以检查账号是否存在、账号和密码是否匹配,若不存在或不匹配则禁止登录,并返回“用户或密码不正确”的错误信息,否则允许登录,并返回“登录成功”的信息。

客户端主程序如下所示。除了最后的处理函数改为Login()外,其余部分和《Unix网络编程》第5章TCP回射客户程序tcpcli01.c基本相同。

/**
* Program:
*    A client program requesting server for registration or login.
* History:
*    2016/5/5  along  ver1.0
*/

#include "unp.h"

int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;

if (argc != 2)
err_quit("Usage: logincli <IPaddress>\n");

sockfd = Socket(AF_INET, SOCK_STREAM, 1);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));

Login(sockfd);
return 0;
}


客户器请求注册登陆的函数(其中GetUserInfo()函数负责获取usrInfo)

void Login(int sockfd)
{
char usrInfo[MAXSIZE];
char result[MAXSIZE];

if (GetUserInfo(usrInfo) == 0)
return;

Writen(sockfd, usrInfo, MAXLINE);
if (Readline(sockfd, result, MAXSIZE) == 0)
err_quit("login: server terminated prematurely");

Fputs(result, stdout);
}


服务器主程序(如下所示。除了其中的处理函数改为CheckPlayer(),其余部分和《Unix网络编程》第5章TCP回射服务器tcpserv01.c基本相同。

/**
* Program:
*    A echo server program using tcp protocol.
* History:
*    2016/4/24  along  ver1.0
*/

#include "unp.h"
#include "sigchldwaitpid.h"
#include "checkplayer.h"
#include "player.h"

int main()
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;

listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

Listen(listenfd, LISTENQ);
Signal(SIGCHLD, sig_chld);

for ( ; ; )
{
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
CheckPlayer(connfd);
Close(connfd);
}
}


服务器处理用户请求函数

void CheckPlayer(int sockfd)
{
ssize_t n;
char choice;
char buf[MAXLINE];
char result[MAXLINE];
PlayerInfo plyrInfo;
SignerInfo sgnrInfo;

again:
n = read(sockfd, buf, MAXLINE);

if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
{
snprintf(result, MAXLINE, "Read Error.\n");
Writen(sockfd, result, strlen(result));
return;
}

choice = buf[0];
if (choice < '1' || choice > '2')
{
snprintf(result, MAXLINE, "Error: Unknow request.\n");
}
else if (choice == '1')  /* Request to login */
{
sscanf(buf, "%c %s %s", &choice,
sgnrInfo.name, sgnrInfo.password);
CheckLogin(&sgnrInfo, result);
}
else
{
sscanf(buf, "%c %s %s %s %s", &choice,
plyrInfo.name, plyrInfo.phone,
plyrInfo.email, plyrInfo.password);
CheckRegister(&plyrInfo, result);
}

Writen(sockfd, result, strlen(result));
}


2016/5/7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: