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 != )
err_quit("Usage: logincli <IPaddress>\n"); sockfd = Socket(AF_INET, SOCK_STREAM, ); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[], &servaddr.sin_addr); Connect(sockfd, (SA *) &servaddr, sizeof(servaddr)); Login(sockfd);
return ;
}

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

void Login(int sockfd)
{
char usrInfo[MAXSIZE];
char result[MAXSIZE]; if (GetUserInfo(usrInfo) == )
return; Writen(sockfd, usrInfo, MAXLINE);
if (Readline(sockfd, result, MAXSIZE) == )
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, );
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 < && errno == EINTR)
goto again;
else if (n < )
{
snprintf(result, MAXLINE, "Read Error.\n");
Writen(sockfd, result, strlen(result));
return;
} choice = buf[];
if (choice < '' || choice > '')
{
snprintf(result, MAXLINE, "Error: Unknow request.\n");
}
else if (choice == '') /* 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套接字的注册登录系统的更多相关文章

  1. Linux/UNIX套接字连接

    套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...

  2. Unix套接字接口

    简介 套接字是操作系统中用于网络通信的重要结构,它是建立在网络体系结构的传输层,用于主机之间数据的发送和接收,像web中使用的http协议便是建立在socket之上的.这一节主要讨论网络套接字. 套接 ...

  3. NetLink通信原理研究、Netlink底层源码分析、以及基于Netlink_Connector套接字监控系统进程行为技术研究

    1. Netlink简介 0x1:基本概念 Netlink是一个灵活,高效的”内核-用户态“.”内核-内核“.”用户态-用户态“通信机制.通过将复杂的消息拷贝和消息通知机制封装在统一的socket a ...

  4. 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发

    ''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ...

  5. MFC基于CAsyncSocket套接字客户端代码示范

    MFC基于CAsyncSocket套接字客户端代码示范 https://blog.csdn.net/txwtech/article/details/93016190

  6. 监听套接字描述字 已连接套接字描述字 和打电话的情形非常不一样的地方 完成了 TCP 三次握手,操作系统内核就为这个客户生成一个已连接套接字

    1. accept: 电话铃响起了-- 当客户端的连接请求到达时,服务器端应答成功,连接建立,这个时候操作系统内核需要把这个事件通知到应用程序,并让应用程序感知到这个连接.这个过程,就好比电信运营商完 ...

  7. DIY一个基于树莓派和Python的无人机视觉跟踪系统

    DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...

  8. php注册登录系统(一)-极简

    序 登录注册系统是日常上网最普通的操作,我设了一个分类一步步完善注册登录系统,若有哪里错误请慧教 所用语言:php 数据库 :mysql 本次实现功能: 1.用户注册 2.用户登录 主要文件: 完整代 ...

  9. fsockopen — 打开一个网络连接或者一个Unix套接字连接

    fsockopen (PHP 4, PHP 5, PHP 7) 说明 resource fsockopen ( string $hostname [, int $port = -1 [, int &a ...

随机推荐

  1. 015_使用 expect 工具自动交互密码远程其他主机安装 httpd 软件

    #!/bin/bash#删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机rm -rf ~/.ssh/known_hostsexpect <<E ...

  2. webservice三要素

    1. 2. 3.

  3. appium测试android环境搭建(win7)

    第一步:安装appium 1. 下载并安装Node.js(地址:https://nodejs.org/download/) 2. 下载git, 并且配置环境变量:(之前没有配置git, 报错找不到gi ...

  4. fmt

    fmt.Println("hello world") fmt.Printf("%T",a)打印a 的类型 fmt.Printf("%v",a ...

  5. vscode集成eslint

    1. 安装 ESLint 扩展 首先,打开 VSCode 扩展面板并搜索 ESLint 扩展,然后点击安装 2. 项目安装eslint yarn add eslint -D 3. 设置eslint配置 ...

  6. elasticsearch文档冲突

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/optimistic-concurrency-control.html当我们之前 ...

  7. jinja2-模版继承

    一 简要 简单的来说模板继承包含基本模板和子模板.其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充. 二 基本模版样例 这个模板 ...

  8. 区间dp括号匹配

    POJ2955 匹配则加一,不需要初始化 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> ...

  9. Flutter移动电商实战 --(16)切换后页面状态的保持AutomaticKeepAliveClientMixin

    底栏切换每次都重新请求是一件非常恶心的事,flutter 中提供了AutomaticKeepAliveClientMixin 帮我们完成页面状态保存效果. 1.AutomaticKeepAliveCl ...

  10. CodeWar打怪升级-Python篇

    1.  The goal of this exercise is to convert a string to a new string where each character in the new ...