⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wbqqregserdlg.cpp

📁 基于TCP的局域网多用户通信、文件传送程序详解
💻 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 + -