新手上路,自己学得一知半解,按照自己的理解,码了一个基于UDP的聊天服务器,后续会写与其配套的客户端。
此服务器,主要有以下几点的功能:
1.登录功能
2.注册功能
3.查询功能
4.退出功能
其具体介绍如下:
1.登录功能
传输数据格式:char recvBuf[100]
客户端向服务器传输时格式为:
当首位recvBuf[0]为'L'时,进入登录功能。
[1]~[10]为用户名user;
[11]~[20]为密码password;
[21]~[35]为IP地址ip;(每次登录时要进行更新)
服务端向客户端返回格式为:
[0]为'L'
[1]若为'1'则成功,若为'0'则失败(客户端需要对其返回消息进行相应操作)
登录功能将用户名和密码于数据库中信息进行比对,若正确,则返回"L1"并且更新该用户的IP地址,否则则返回"L0"即登录失败。
2.注册功能
传输数据格式:char recvBuf[100]
客户端向服务器传输时格式为:
当首位recvBuf[0]为'R'时,进入注册功能。
[1]为'1'时,进入注册查重功能,为'0'时,进入实际注册功能
2.1 查重功能
客户端向服务器传输时格式为:
'R'+'1'+user,其中user占10个长度
服务器向客户端返回格式为:
"R11"重复,"R10"不重复
其主要功能为检测用户名是否重复(在数据库中)。
2.2 实际注册功能
客户端向服务器传输时格式为:
'R'+'0'+user+password+IP,其中user,password,IP占用长度分别为10,10,15
服务器向客户端返回格式为:
"R01"成功,"R00"失败
其主功能为向数据库中插入一条新的用户数据(包括用户名,密码,当前IP)
3.查询功能
客户端向服务器传输时格式为:
'F'+user,其中user占10个长度
服务器向客户端返回格式为:
"F0"没用找到该用户;
'F'+'1'+IP 有该用户,且IP为...,其中IP占15个长度
主要功能为查询目标用户的IP。
4.退出功能
客户端向服务器传输时格式为:
'q'+user,其中user占10个长度
服务器向客户端返回格式为:
"q1"成功退出;"q0"退出失败
主要功能为告知服务器此用户已退出,并把此用户的IP改为"xxx.xxx.xxx.xxx"
其下是具体代码:
#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")
using namespace std;
void menu(char recvBuf0,char *recvBuf,SOCKET sockSrv,SOCKADDR_IN addrSrv,int len);
void login(char *recvBuf,SOCKET sockSrv,SOCKADDR_IN addrClient,int len);
void _register(char *recvBuf,SOCKET sockSrv,SOCKADDR_IN addrClient,int len);
void findIP(char *recvBuf,SOCKET sockSrv,SOCKADDR_IN addrClient,int len);
void quit(char *recvBuf,SOCKET sockSrv,SOCKADDR_IN addrClient,int len);
BOOL find(MYSQL* mysql,string u,string p);
struct conn_info {
char *host;
char *user;
char *password;
char *db;
};
class Mysql
{
public:
/*