码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-07 23:55:17      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:

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

     

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

标签:

原文地址:http://www.cnblogs.com/wuhualong/p/Programming_LoginSystem_01.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!