标签:
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
标签:
原文地址:http://www.cnblogs.com/wuhualong/p/Programming_LoginSystem_01.html