📄 wbqqregserdlg.cpp
字号:
// wbQQRegSerDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wbQQRegSer.h"
#include "wbQQRegSerDlg.h"
#include "User.h"
#define PORT (u_short)1975
#define MAXBUFLEN 5025
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////全局函数///////////////////////////////////
UINT talkToClient(void *cs)
{
bool bLoad = false;
char buffer[MAXBUFLEN];
int numrcv;
SOCKET clientSocket = (SOCKET)cs;
while (1)
{
numrcv = recv(clientSocket, buffer, MAXBUFLEN, 0);
if ((numrcv == 0) || (numrcv == SOCKET_ERROR))
{
AfxMessageBox("Connection terminated!", MB_OK);
break;
}
buffer[numrcv] = '\0';
char start[6];
char *pos = strchr(buffer, ':');
int lenBuffer = strlen(buffer);
int len = lenBuffer - strlen(pos);
for (int i=0; i<len; i++)
{
start[i] = buffer[i];
}
start[len] = '\0';
char *posData = pos+1;
CString turn;
///////////////////////////注册/////////////////////////////////////////////
if (strcmp(start, "Reg") == 0)
{
CString userName;
CString age;
CString sex;
CString passWord;
CString trueName;
CString city;
CString email;
CString res;
CString tel;
bool bExist = false;
char data[100]; //获得用户名
pos = strchr(posData, ',');
int lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
userName = data;
posData = pos +1;
CUser rec;
rec.m_strSort = "userName";
rec.Open();
while (!rec.IsEOF()) //若用户名存在则发送exist!
{
if (rec.m_userName == userName)
{
bExist = true;
turn = "exist!";
send(clientSocket, turn, strlen(turn) + 1, 0);
shutdown(clientSocket, 2);
closesocket(clientSocket);
rec.Close();
break;
ExitThread(0);
}
rec.MoveNext();
}
if (bExist)
{
break;
}
pos = strchr(posData, ','); //获得年龄
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
age = data;
posData = pos +1;
pos = strchr(posData, ','); //获得性别
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
sex = data;
posData = pos +1;
pos = strchr(posData, ','); //获得登录密码
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
passWord = data;
posData = pos +1;
pos = strchr(posData, ','); //获得真实姓名
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
trueName = data;
posData = pos +1;
pos = strchr(posData, ','); //获得城市
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
city = data;
posData = pos +1;
pos = strchr(posData, ','); //获得E-mail
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
email = data;
posData = pos +1;
pos = strchr(posData, ','); //获得资源ID
lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
res = data;
posData = pos +1;
tel = posData; //获得电话号码
rec.AddNew();
rec.m_age = atoi(age);
rec.m_city = city;
rec.m_email = email;
rec.m_passWord = passWord;
rec.m_res = atoi(res);
rec.m_sex = sex;
rec.m_tel = tel;
rec.m_trueName = trueName;
rec.m_userName = userName;
if (rec.Update()) //添加记录成功发送success!,否则发送error!
{
turn = "success!";
}
else
{
turn = "error!";
}
send(clientSocket, turn, strlen(turn) + 1, 0);
rec.Close();
shutdown(clientSocket, 2);
closesocket(clientSocket);
break;
}
///////////////////////////////登录///////////////////////////////////
else if (strcmp(start, "Load") == 0)
{
CString userName;
CString passWord;
char data[100]; //获得用户名
pos = strchr(posData, ',');
int lenData = strlen(posData);
len = lenData - strlen(pos);
for (i=0; i<len; i++)
{
data[i] = posData[i];
}
data[len] = '\0';
userName = data;
posData = pos +1;
passWord = posData; //获得登录密码
CUser rec;
rec.m_strSort = "userName";
rec.Open();
CString info;
while (!rec.IsEOF())
{
if (rec.m_userName==userName && rec.m_passWord==passWord)
{
turn = "success!";
bLoad = true;
}
info += rec.m_userName;
info += ",";
CString resource;
resource.Format("%d", rec.m_res);
info += resource;
info += ",";
info += rec.m_city;
info += "\r\n";
rec.MoveNext();
}
rec.Close();
if (!bLoad)
{
turn = "error!";
}
else
{
turn += info;
}
send(clientSocket, turn, strlen(turn) + 1, 0);
shutdown(clientSocket, 2);
closesocket(clientSocket);
break;
}
delete posData;
delete pos;
}
ExitThread(0);
return 1;
}
/////////////////////////////////注册登录线程////////////////////////////////
UINT RegLoad(void *s)
{
int status;
int addrLen;
SOCKADDR_IN clientSockAddr;
SOCKET serverSocket;
SOCKET clientSocket;
addrLen = sizeof (SOCKADDR_IN);
serverSocket = SOCKET(s);
while (1)
{
CWinThread* pThread;
clientSocket = accept(serverSocket, (LPSOCKADDR)&clientSockAddr, &addrLen);
pThread = AfxBeginThread(talkToClient, (LPVOID)clientSocket);
if (pThread == NULL)
{
AfxMessageBox("ERROR: Unable to create thread!", MB_OK);
status = closesocket(clientSocket);
if (status == SOCKET_ERROR)
{
AfxMessageBox("ERROR: closesocket unsuccessful!", MB_OK);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CWbQQRegSerDlg dialog
CWbQQRegSerDlg::CWbQQRegSerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CWbQQRegSerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CWbQQRegSerDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CWbQQRegSerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWbQQRegSerDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWbQQRegSerDlg, CDialog)
//{{AFX_MSG_MAP(CWbQQRegSerDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_RUN, OnBtnRun)
ON_BN_CLICKED(IDC_BTN_CLOSE, OnBtnClose)
ON_BN_CLICKED(IDC_BTN_RUNCHAT, OnBtnRunchat)
ON_BN_CLICKED(IDC_BTN_CLOSECHAT, OnBtnClosechat)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWbQQRegSerDlg message handlers
BOOL CWbQQRegSerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
InitNet();
OnBtnRun();
OnBtnRunchat();
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CWbQQRegSerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CWbQQRegSerDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
bool CWbQQRegSerDlg::InitNet()
{
status = WSAStartup(MAKEWORD(1, 1), &Data);
if (status != 0)
{
MessageBox("ERROR: WSAStartup unsuccessful!", "闻博QQ", MB_OK);
return false;
}
memset(&serverSockAddr, 0, sizeof (serverSockAddr));
serverSockAddr.sin_port = htons(PORT);
serverSockAddr.sin_family = AF_INET;
serverSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
{
MessageBox("ERROR: socket unsuccessful!", "闻博QQ", MB_OK);
status = WSACleanup();
if (status == SOCKET_ERROR)
{
MessageBox("ERROR: WSACleanup unsuccessful!", "闻博QQ", MB_OK);
}
return false;
}
status = bind(serverSocket, (LPSOCKADDR)&serverSockAddr, sizeof (serverSockAddr));
if (status == SOCKET_ERROR)
{
MessageBox("ERROR: Bind unsuccessful!", "闻博QQ", MB_OK);
return false;
}
status = listen(serverSocket, 5);
if (status == SOCKET_ERROR)
{
MessageBox("ERROR: Listen unsuccessful!", "闻博QQ", MB_OK);
return false;
}
return true;
}
void CWbQQRegSerDlg::OnBtnRun()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_BTN_RUN)->EnableWindow(false);
GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(true);
AfxBeginThread(RegLoad, (LPVOID)serverSocket);
}
void CWbQQRegSerDlg::OnBtnClose()
{
// TODO: Add your control notification handler code here
if (AfxMessageBox("真的要关闭注册登录服务器吗?", MB_YESNO) == IDYES)
{
OnCancel();
}
}
void CWbQQRegSerDlg::OnBtnRunchat() //运行聊天通信服务器进程
{
// TODO: Add your control notification handler code here
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( CreateProcess( NULL, // No module name (use command line).
".\\..\\wbQQChat\\wbQQChat.exe", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
GetDlgItem(IDC_BTN_RUNCHAT)->EnableWindow(false);
GetDlgItem(IDC_BTN_CLOSECHAT)->EnableWindow(true);
m_hProcChat = pi.hProcess;
}
}
void CWbQQRegSerDlg::OnBtnClosechat() //关闭聊天通信服务器进程
{
// TODO: Add your control notification handler code here
if (AfxMessageBox("真的要关闭聊天通信服务器吗?", MB_YESNO) == IDYES)
{
TerminateProcess(m_hProcChat, 2);
if (WaitForSingleObject(m_hProcChat, 1000) == WAIT_OBJECT_0) //当进程终止时有信号
{
GetDlgItem(IDC_BTN_RUNCHAT)->EnableWindow(true);
GetDlgItem(IDC_BTN_CLOSECHAT)->EnableWindow(false);
}
}
}
void CWbQQRegSerDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if (NULL != m_hProcChat)
TerminateProcess(m_hProcChat, 2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -