zoukankan      html  css  js  c++  java
  • 一个基于Unix套接字的注册登录系统

    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>
    ");
    
        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.
    ");
            Writen(sockfd, result, strlen(result));
            return;
        }   
    
        choice = buf[0];
        if (choice < '1' || choice > '2')
        {   
            snprintf(result, MAXLINE, "Error: Unknow request.
    ");
        }   
        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

         

  • 相关阅读:
    MySQL体系结构
    Java线程池ThreadPoolExecuter:execute()原理
    Java Thread 如何处理未捕获的异常?
    SSL/TSL握手过程详解
    LockSupport HotSpot里park/unpark的实现
    JAVA 对象内存结构
    JAVA 线程状态转换
    Spring源码解析(四)Bean的实例化和依赖注入
    Spring源码解析(五)循环依赖问题
    Spring源码解析(三)BeanDefinition的载入、解析和注册
  • 原文地址:https://www.cnblogs.com/wuhualong/p/Programming_LoginSystem_01.html
Copyright © 2011-2022 走看看