#include <winsock2.h>
#include <ws2tcpip.h>
#include<windows.h>
#include<commCtrl.h>
#include"resource.h"
#include <wincrypt.h>
#include<atlstr.h>
#include<string>
#include <gdiplus.h>
#include <algorithm>
#pragma comment(lib, "gdiplus.lib")
#pragma comment(lib,"ws2_32.lib")
// 全局变量
SOCKET g_clientSocket = INVALID_SOCKET; // 全局套接字,保持连接
bool g_isConnected = false; // 连接状态标志
WCHAR g_szAccount[32] = { 0 }; // 账号
WCHAR g_szPassword[32] = { 0 }; // 密码
WCHAR g_szNickname[32] = { 0 }; // 昵称
WCHAR g_szGender[16] = { 0 }; // 性别
WCHAR g_szAge[8] = { 0 }; // 年龄
WCHAR g_szSignature[128] = { 0 }; // 个性签名
BYTE* g_pImageData = NULL;//储存头像的二进制数据//
DWORD g_dwImageSize = 0;//数据大小//
int passwd_back_to_account = 0;//账号是否已产生,防止密码设置时,按下取消键,回到账号生成框后,重新生成账号//
INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//初始化对话框//
{
static UINT_PTR TimeID = 0;//启用定时器//
static HBRUSH hBackgroundBrush = NULL;//背景画刷//
static HBITMAP hBmp = NULL;//位图句柄//
switch (uMsg)
{
case WM_INITDIALOG:
//SetDlgItemText(hwndDlg, IDC_EDIT3, L"Welcome to QQ");//第一个对话框的内容//
TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒//
hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色//
hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置//
if (hBmp)
{
SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);
}
else
{
MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR);
}
return (INT_PTR)TRUE;//设置焦点//
case WM_DRAWITEM: {
DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam;
if (pdis->CtlID == IDC_CUSTOM_TEXT) {
SetTextColor(pdis->hDC, RGB(255, 0, 0));
DrawText(pdis->hDC, L"Welcome to QQ", -1, &pdis->rcItem,//对话框标题//
DT_CENTER | DT_VCENTER);
}
return (INT_PTR)TRUE;
}
case WM_CTLCOLORDLG:
return (INT_PTR)hBackgroundBrush;
case WM_COMMAND:
if (LOWORD(wParam) == IDSTART)
{
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
/*case WM_TIMER:
if (wParam == 1)
{
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
*/
case WM_DESTROY:
KillTimer(hwndDlg, TimeID);//销毁定时器//
DeleteObject(hBackgroundBrush);//释放画刷//
DeleteObject(hBmp);//释放位图资源//
EndDialog(hwndDlg, IDCANCEL);//关闭对话框//
break;
case WM_CLOSE:
EndDialog(hwndDlg, IDEND);//关闭对话框//
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框//
{
static UINT_PTR TimeID = 0;//启用定时器//
static HBRUSH hBackgroundBrush = NULL;//背景画刷//
static HBITMAP hBmp = NULL;//位图句柄//
switch (uMsg)
{
case WM_INITDIALOG:
TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒//
hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色//
return (INT_PTR)TRUE;//设置焦点//
case WM_DRAWITEM: {
DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam;
if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) {
SetTextColor(pdis->hDC, RGB(255, 0, 0));
DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题//
DT_CENTER | DT_VCENTER);
}
return (INT_PTR)TRUE;
}
case WM_CTLCOLORDLG:
return (INT_PTR)hBackgroundBrush;
case WM_TIMER:
if (wParam == 1)
{
KillTimer(hwndDlg, TimeID);//销毁定时器//
DeleteObject(hBackgroundBrush);//释放画刷//
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hwndDlg, IDEND);//关闭对话框//
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_two(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录和注册选择框//
{
passwd_back_to_account = 0;
switch (uMsg)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDLOGIN:
EndDialog(hwndDlg, IDLOGIN);
return (INT_PTR)TRUE;
case IDREGISTER:
EndDialog(hwndDlg, IDREGISTER);
return (INT_PTR)TRUE;
}break;
case WM_CLOSE:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_three(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录框//
{
static bool EDIT1 = FALSE;
static bool EDIT2 = FALSE;
HWND hEdit = NULL;
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT3, L"账号");
SetDlgItemText(hwndDlg, IDC_EDIT4, L"密码");
SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号");
SetDlgItemText(hwndDlg, IDC_EDIT2, L"密码");
SendMessage(GetDlgItem(hwndDlg, IDC_EDIT1), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
SendMessage(GetDlgItem(hwndDlg, IDC_EDIT2), WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);
return (INT_PTR)TRUE;
case WM_CTLCOLOREDIT://设置水印文字//
hEdit = (HWND)lParam;
if (!EDIT1 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT1))
{
SetTextColor((HDC)wParam,RGB(200,200,200));
return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
}
if (!EDIT2 && hEdit == GetDlgItem(hwndDlg, IDC_EDIT2))
{
SetTextColor((HDC)wParam, RGB(200, 200, 200));
return (LRESULT)GetSysColorBrush(COLOR_WINDOW);
}break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EDIT1:
if (HIWORD(wParam) == EN_SETFOCUS && !EDIT1)
{
SetDlgItemText(hwndDlg, IDC_EDIT1, L"");
EDIT1 = TRUE;
}
else if (HIWORD(wParam) == EN_KILLFOCUS)
{
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT1)) == 0)
{
SetDlgItemText(hwndDlg, IDC_EDIT1, L"账号");
EDIT1 = FALSE;
}
}break;
case IDC_EDIT2:
if (HIWORD(wParam) == EN_SETFOCUS && !EDIT2)
{
SetDlgItemText(hwndDlg, IDC_EDIT2, L"");
EDIT2 = TRUE;
}
else if (HIWORD(wParam) == EN_KILLFOCUS)
{
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_EDIT2)) == 0)
{
SetDlgItemText(hwndDlg, IDC_EDIT2, L"账号");
EDIT2 = FALSE;
}
}break;
case IDOK:
//服务器验证账号密码的有效性//
MessageBox(hwndDlg, L"服务器正在验证账号密码的有效性", L"QQ", MB_ICONINFORMATION);
MessageBox(hwndDlg, L"登录成功", L"QQ", MB_ICONINFORMATION);
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
int Generate_register_number()//产生账号//
{
HCRYPTPROV hProvider = 0;
CryptAcquireContext(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
long long randomNum = 0;
CryptGenRandom(hProvider, sizeof(randomNum), (BYTE*)&randomNum);//randomNum接收产生的随机数//
CryptReleaseContext(hProvider, 0);
int num=abs(randomNum % 9000000000) + 1000000000; // 转换为10位数
if (num > 0)
return num;
else if (num <= 0)
return -num;
}
INT_PTR CALLBACK Dialog_four(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册框//
{
static long long num = 0;
DRAWITEMSTRUCT* pdis = NULL;
CString str;
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT5, L"服务器分配给你的账号");
if (passwd_back_to_account == 0)
{
num = Generate_register_number();
}
str.Format(L"%lld", num);
wcscpy_s(g_szAccount,32,str);//将账号保存到全局变量g_szAccount//
SetDlgItemText(hwndDlg, IDC_EDIT6,str);
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDGOON:
EndDialog(hwndDlg, IDGOON);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_five(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//密码设置框//
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT9, L"密码设置");
SetDlgItemText(hwndDlg, IDC_EDIT10, L"密码确认");
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDFINISH:
// 获取密码并验证
WCHAR szPassword1[32], szPassword2[32];
GetDlgItemText(hwndDlg, IDC_EDIT7, szPassword1, 32);
GetDlgItemText(hwndDlg, IDC_EDIT8, szPassword2, 32);
if (szPassword1[0] == '\0')
{
MessageBox(NULL, L"密码不能为空", L"QQ", MB_ICONERROR);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT7));
return (INT_PTR)TRUE;
}
if (wcscmp(szPassword1, szPassword2) != 0)//比较前后两次设置的密码是否相同//
{
MessageBox(hwndDlg, L"两次输入的密码不一致,请重新输入", L"QQ", MB_ICONERROR);
SetDlgItemText(hwndDlg, IDC_EDIT8, L"");//清除密码//
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT8));
return (INT_PTR)TRUE;
}
// 保存密码到全局变量
wcscpy_s(g_szPassword, szPassword1);
MessageBox(hwndDlg, L"密码已成功设置", L"QQ", MB_ICONINFORMATION);
EndDialog(hwndDlg, IDFINISH);
return (INT_PTR)TRUE;
case IDCANCEL:
passwd_back_to_account = 1;//账号已生成标志//
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_six(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册成功框//
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT11, L"注册成功,按下“确认”即可跳转到到登录界面.");
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_seven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//注册时个人信息框//
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT19, L"昵称");
SetDlgItemText(hwndDlg, IDC_EDIT12, L"性别");
SetDlgItemText(hwndDlg, IDC_EDIT13, L"年龄");
SetDlgItemText(hwndDlg, IDC_EDIT14, L"个性签名");
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
// 获取所有个人信息
GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname//
GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender//
GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge//
GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname//
if (g_szNickname[0] == '\0')
{
MessageBox(NULL, L"昵称未设置", L"QQ", MB_ICONERROR);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT19));
return (INT_PTR)TRUE;
}
if (g_szGender[0] == '\0'||(wcscmp(g_szGender,L"男")!=0)&&(wcscmp(g_szGender, L"女")!=0))
{
if(g_szGender[0] == '\0')
MessageBox(NULL, L"性别未设置", L"QQ", MB_ICONERROR);
else if(wcscmp(g_szGender,L"男")!=0 && wcscmp(g_szGender, L"女")!=0)
MessageBox(NULL, L"性别设置错误,性别只能是‘男’或者‘女'", L"QQ", MB_ICONERROR);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT12));
return (INT_PTR)TRUE;
}
if (g_szAge[0] == '\0')
{
MessageBox(NULL, L"年龄未设置", L"QQ", MB_ICONERROR);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT13));
return (INT_PTR)TRUE;
}
if (g_szSignature[0] == '\0')
{
MessageBox(NULL, L"个性签名未设置", L"QQ", MB_ICONERROR);
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT14));
return (INT_PTR)TRUE;
}
// 再次获取所有个人信息
GetDlgItemText(hwndDlg, IDC_EDIT15, g_szNickname, 32);//将昵称保存到全局变量g_szNickname//
GetDlgItemText(hwndDlg, IDC_EDIT16, g_szGender, 16);//将性别保存到全局变量g_szGender//
GetDlgItemText(hwndDlg, IDC_EDIT17, g_szAge, 8);//将年龄保存到全局变量g_szAge//
GetDlgItemText(hwndDlg, IDC_EDIT18, g_szSignature, 128);//将个性签名保存到全局变量g_szNickname//
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
WCHAR g_szPhotoPath[MAX_PATH] = L"";
HBITMAP g_hBitmap = NULL;//HBITMAP 是位图的句柄类型//
HBITMAP LoadImageFileToBitmap(HWND hwnd, LPCWSTR path, int width, int height)//加载头像,LPCWSTR指向常量宽字符字符串的长指针//
{
using namespace Gdiplus;
static ULONG_PTR gdiplusToken = 0;
if (!gdiplusToken) //检查GDI+是否初始化//
{
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
Bitmap bmp(path);//加载图片//
if (bmp.GetLastStatus() != Ok) //检查bmp最近最后一次的操作状态是否成功,即加载图片是否成功//
return NULL;
// 缩放到控件大小
Bitmap* pThumb = new Bitmap(width, height, bmp.GetPixelFormat());//bmp.GetPixelFormat获取位图的像素格式//
Graphics g(pThumb);//Graphics是GDI+的核心绘图类,封装了所有绘图操作;g是定义的Graphics的对象名;pThumb:指向Bitmap对象的指针//
g.DrawImage(&bmp, 0, 0, width, height);//进行图像绘制//
HBITMAP hBmp = NULL;
pThumb->GetHBITMAP(Color(200,230,255), &hBmp);
delete pThumb;
//读取文件//
HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, L"读取头像文件失败", L"QQ",MB_ICONERROR);
return hBmp;
}
else
{
g_dwImageSize = GetFileSize(hFile, NULL);//获取数据大小//
g_pImageData = new BYTE[g_dwImageSize];
DWORD dwREAD;
ReadFile(hFile, g_pImageData, g_dwImageSize, &dwREAD, NULL);//将图片文件存储在g_pImageData中//
CloseHandle(hFile);//释放文件句柄//
}
return hBmp;
}
INT_PTR CALLBACK Dialog_eight(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//头像上传框//
{
OPENFILENAME ofn = { 0 };//初始化文件对话框//
WCHAR szFile[MAX_PATH] = L"";//头文件<windows.h>包含了MAX_PATH的定义//
switch (uMsg)
{
case WM_INITDIALOG:
g_szPhotoPath[0] = 0;
if (g_hBitmap)
{
DeleteObject(g_hBitmap);
g_hBitmap = NULL;
}
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDPHOTO:
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndDlg;
ofn.lpstrFilter = L"图片文件 (*.jpg;*.png)\0*.jpg;*.png\0所有文件 (*.*)\0*.*\0";
ofn.lpstrFile = szFile;//保存图片路径//
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
if (GetOpenFileName(&ofn)) {
// 检查扩展名
std::wstring path = szFile;//获取图片了路径//
auto pos = path.find_last_of(L'.');//在字符串中从后向前查找最后一个.字符的位置//
if (pos == std::wstring::npos) {
MessageBox(hwndDlg, L"文件无扩展名,无法识别", L"QQ", MB_OK | MB_ICONERROR);
break;
}
std::wstring ext = path.substr(pos);//获取扩展名//
std::transform(ext.begin(), ext.end(), ext.begin(), ::towlower);//将扩展名的字符转化为小写,towlower所要进行的操作//
if (ext != L".jpg" && ext != L".png") {
MessageBox(hwndDlg, L"仅支持jpg和png", L"QQ", MB_OK | MB_ICONWARNING);
break;
}
// 保存路径
wcsncpy_s(g_szPhotoPath, szFile, _TRUNCATE);//将szFile里的路径保存到g_szPhotoPath,_TRUNCATE允许截断路径,防止溢出目标缓冲区//
// 加载并显示到静态控件
if (g_hBitmap)
{
DeleteObject(g_hBitmap);
g_hBitmap = NULL;
}
RECT rc;//rc的坐标是屏幕坐标//
GetWindowRect(GetDlgItem(hwndDlg, IDC_MY_IMAGE_TWO), &rc);//获取图片控件的位置和尺寸,并保存到rc中//
MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rc, 2);//将rc的坐标转换为窗口坐标//
int w = rc.right - rc.left, h = rc.bottom - rc.top;//获取图片的宽和高//
g_hBitmap = LoadImageFileToBitmap(hwndDlg, g_szPhotoPath, w, h);
if (g_hBitmap)
SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_TWO, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)g_hBitmap);//向对话框指定控件发送消息,这里是更新图片控件//
else
MessageBox(hwndDlg, L"图片加载失败", L"QQ", MB_OK | MB_ICONERROR);
}
return (INT_PTR)TRUE;
case IDOK:
if (wcslen(g_szPhotoPath) == 0)
{
MessageBox(hwndDlg, L"请先上传头像", L"QQ", MB_OK | MB_ICONWARNING);
break;
}
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
case WM_DESTROY:
if (g_hBitmap)
{
DeleteObject(g_hBitmap);
g_hBitmap = NULL;
}
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}
//IP格式验证//
bool IsValidIP(const WCHAR* ip) {
char ipAnsi[16];
// 将宽字符转换为ANSI
WideCharToMultiByte(CP_ACP, 0, ip, -1, ipAnsi, 16, NULL, NULL);
struct in_addr addr;
// 尝试转换IP地址
return (inet_pton(AF_INET, ipAnsi, &addr) == 1);
}
INT_PTR CALLBACK Dialog_nine(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//IP输入框//
{
HANDLE hThread = NULL;
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT20, L"服务器IP");
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
WCHAR IP[16];
GetDlgItemText(hwndDlg, IDC_EDIT21, IP, 16);//获取IP地址,存储在IP数组里面//
if (!IsValidIP(IP))//IP格式验证//
{
MessageBox(hwndDlg, L"IP格式错误", L"QQ", MB_ICONERROR);
SetDlgItemText(hwndDlg, IDC_EDIT21, L"");//清除错误IP//
SetFocus(GetDlgItem(hwndDlg, IDC_EDIT21));
return (INT_PTR)TRUE;
}
MessageBox(hwndDlg, L"IP格式正确", L"QQ", MB_ICONINFORMATION);
// 禁用确定按钮,防止重复点击
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
//创建工作线程,执行网络连接//
DWORD threadId;
hThread = CreateThread(
NULL, 0,
[](LPVOID param)->DWORD {
HWND hwnd = (HWND)param;
g_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字//
if (g_clientSocket == INVALID_SOCKET)
{
MessageBox(hwnd, L"创建套接字失败", L"QQ", MB_ICONERROR);
return 1;
}
MessageBox(hwnd, L"创建套接字成功", L"QQ", MB_ICONINFORMATION);
//设置服务器地址//
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);//服务器端口//
WCHAR IP[16];
GetDlgItemText(hwnd, IDC_EDIT21, IP, 16);//从对话框获取IP地址//
char ipAnsi[16];
WideCharToMultiByte(CP_ACP, 0, IP, -1, ipAnsi, 16, NULL, NULL);//IP地址转化为char类型//
inet_pton(AF_INET, ipAnsi, &serverAddr.sin_addr);
if (connect(g_clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) //连接服务器//
{
int error = WSAGetLastError();
switch (error)
{
case WSAECONNREFUSED:
MessageBox(hwnd, L"连接被拒绝", L"QQ", MB_ICONERROR);
break;
case WSAENETUNREACH:
MessageBox(hwnd, L"网络不可达", L"QQ", MB_ICONERROR);
break;
case WSAEHOSTDOWN:
MessageBox(hwnd, L"主机不可达", L"QQ", MB_ICONERROR);
break;
case WSAETIMEDOUT:
MessageBox(hwnd, L"连接超时", L"QQ", MB_ICONERROR);
break;
default:
MessageBox(hwnd, L"连接服务器失败", L"QQ", MB_ICONERROR);
break;
}
closesocket(g_clientSocket);
g_clientSocket = INVALID_SOCKET;
PostMessage(hwnd, WM_CONNECT_FAILED, 0, 0);
return 1;
}
g_isConnected = true;
PostMessage(hwnd, WM_CONNECT_SUCCESS, 0, 0);
return 0;
}, hwndDlg, 0, &threadId
);
if (hThread)
{
CloseHandle(hThread);//释放线程句柄//
}
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}break;
case WM_CONNECT_SUCCESS:
{
MessageBox(hwndDlg, L"服务器连接成功", L"QQ", MB_ICONINFORMATION);
//发送字符//
const char* msg = "你好,服务器。";
int len = sizeof(msg);
uint32_t netlen = len-1;
send(g_clientSocket, (char*)&netlen, sizeof(netlen), 0);
send(g_clientSocket, msg,len-1, 0);
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
}
case WM_CONNECT_FAILED:
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE); // 重新启用确定按钮
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_ten(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录界面首页框//
{
switch (uMsg)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EDIT22:
EndDialog(hwndDlg, IDC_EDIT22);
return (INT_PTR)TRUE;
case IDC_EDIT23:
EndDialog(hwndDlg, IDC_EDIT23);
return (INT_PTR)TRUE;
case IDC_EDIT24:
EndDialog(hwndDlg, IDC_EDIT24);
return (INT_PTR)TRUE;
case IDC_EDIT25:
EndDialog(hwndDlg, IDC_EDIT25);
return (INT_PTR)TRUE;
case IDC_EDIT26:
EndDialog(hwndDlg, IDC_EDIT26);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
case IDC_EDIT43:
EndDialog(hwndDlg, IDC_EDIT43);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_eleven(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//服务器对话框//
{
switch (uMsg)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_twelve(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//聊天室对话框//
{
switch (uMsg)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_thirdteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//好友列表框//
{
switch (uMsg)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_fourteen(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//登录后个人信息框//
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_EDIT31, L"账号");
SetDlgItemText(hwndDlg, IDC_EDIT32, L"密码");
SetDlgItemText(hwndDlg, IDC_EDIT33, L"昵称");
SetDlgItemText(hwndDlg, IDC_EDIT34, L"性别");
SetDlgItemText(hwndDlg, IDC_EDIT35, L"年龄");
SetDlgItemText(hwndDlg, IDC_EDIT36, L"个性签名");
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwndDlg, IDOK);
return (INT_PTR)TRUE;
case IDCANCEL:
EndDialog(hwndDlg, IDCANCEL);
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
//宽字符串文本发送函数//
void send_wchar(WCHAR wstr[],int wchar_size,SOCKET socket)
{
//计算转换所需要的空间长度//
int len = WideCharToMultiByte(CP_UTF8,0,wstr,wchar_size,NULL,0,NULL,NULL);//发送注册数据到客户端,使用UTF-8进行网络传输,它是国际通用的编码方式//
char* target=new char[len];//存储格式转换后的文本//
//实际转换//
WideCharToMultiByte(CP_UTF8, 0, wstr, wchar_size, target, len, NULL, NULL);
uint32_t len_net =len-1;//主机序转网络序//
send(socket, (char*)&len_net, sizeof(len_net), 0);//先发长度//
send(socket, target, len-1, 0);//再发内容//
delete[]target;
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow)//Winmain主函数//
{
int result_one=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one);
if (result_one == IDEND)//退出// //一级判断//
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框//
}
else if(result_one == IDOK)//一级判断//
{
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result)
{
MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR);
WSACleanup();
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
MessageBox(NULL, L"不支持Winsock2.2", L"QQ", MB_ICONERROR);
WSACleanup();
}
MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION);
INT_PTR result_nine = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_NINE), NULL, Dialog_nine);//IP输入框//
if (result_nine == IDCANCEL)//退出// //二级判断//
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框//
}
else if (result_nine == IDOK)//二级判断//
{
door_one:
INT_PTR result_two = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWO), NULL, Dialog_two);//登录和注册选择框//
if (result_two == IDLOGIN)//登录// //三级判断//
{
INT_PTR result_three = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THREE), NULL, Dialog_three);//登录对话框(需账号和密码验证)//
if (result_three == IDOK) //四级判断//
{
door_two:
int result_ten = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TEN), NULL, Dialog_ten);//登陆界面首页框//
int result_fifteen = 0;
int result_eleven = 0;
int result_twelve = 0;
int result_thirdteen = 0;
int result_fourteen= 0;
switch (result_ten)
{
case IDC_EDIT22:
result_twelve=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_TWELVE), NULL, Dialog_twelve);//聊天室对话框//
switch (result_twelve)
{
case IDOK:
MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION);
break;
case IDCANCEL:
goto door_two;//登陆界面首页框//
break;
}break;
case IDC_EDIT23:
result_thirdteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_THIRDTEEN), NULL, Dialog_thirdteen);//好友框//
switch (result_thirdteen)
{
case IDOK:
MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION);
break;
case IDCANCEL:
goto door_two;//登陆界面首页框//
break;
}break;
case IDC_EDIT24:
result_fourteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOURTEEN), NULL, Dialog_fourteen);//个人信息框//
switch (result_fourteen)
{
case IDOK:
MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION);
break;
case IDCANCEL:
goto door_two;//登陆界面首页框//
break;
}break;
case IDC_EDIT25:
result_fifteen=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//更换头像框//
switch (result_fifteen)
{
case IDOK:
MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION);
break;
case IDCANCEL:
goto door_two;//登陆界面首页框//
break;
}break;
case IDC_EDIT26:
result_eleven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ELEVEN), NULL, Dialog_eleven);//服务器框//
switch (result_eleven)
{
case IDOK:
MessageBox(NULL, L"还未开发", L"QQ", MB_ICONINFORMATION);
break;
case IDCANCEL:
goto door_two;//登陆界面首页框//
break;
}break;
case IDCANCEL:
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框//
break;
case IDC_EDIT43:
goto door_one;//登陆界面首页框//
break;
}
}
else if (result_three == IDCANCEL)//四级判断//
{
goto door_one;//登录和注册选择框//
}
}
else if (result_two == IDREGISTER)//注册// //三级判断//
{
door_three:
INT_PTR result_four = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FOUR), NULL, Dialog_four);//注册对话框//
if (result_four == IDGOON)//四级判断//
{
door_four:
INT_PTR result_five = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_FIVE), NULL, Dialog_five);//密码设置框//
{
if (result_five == IDFINISH)//五级判断//
{
door_five:
int result_seven=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SEVEN), NULL, Dialog_seven);//个人信息框//
if (result_seven==IDCANCEL)//六级判断//
{
goto door_four;
}
else if (result_seven == IDOK)//六级判断//
{
door_six:
int result_eight=DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_EIGHT), NULL, Dialog_eight);//头像上传框//
if (result_eight == IDCANCEL)//七级判断//
{
goto door_five;
}
else if (result_eight == IDOK)//七级判断//
{
INT_PTR result_six = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_SIX), NULL, Dialog_six);//注册成功框//
if (result_six == IDOK)//八级判断//
{
//获取数组大小//
int g_szAccount_len = sizeof(g_szAccount);
int g_szPassword_len = sizeof(g_szPassword);
int g_szNickname_len = sizeof(g_szNickname);
int g_szGender_len = sizeof(g_szGender);
int g_szAge_len = sizeof(g_szAge);
int g_szSignature_len = sizeof(g_szSignature);
//开始发送//
send_wchar(g_szAccount,g_szAccount_len,g_clientSocket);//账号//
send_wchar(g_szPassword,g_szPassword_len,g_clientSocket);//密码//
send_wchar(g_szNickname,g_szNickname_len,g_clientSocket);//昵称//
send_wchar(g_szGender,g_szGender_len, g_clientSocket);//性别//
send_wchar(g_szAge,g_szAge_len, g_clientSocket);//年龄//
send_wchar(g_szSignature,g_szSignature_len,g_clientSocket);//个性签名//
//send(g_clientSocket, (char*)g_pImageData, g_dwImageSize, 0);//头像//
/*
send(g_clientSocket, (const char*)g_szAccount, g_szAccount_len, 0);//账号//
send(g_clientSocket, (const char*)g_szPassword, g_szPassword_len, 0);//密码//
send(g_clientSocket, (const char*)g_szNickname, g_szNickname_len, 0);//昵称//
send(g_clientSocket, (const char*)g_szGender, g_szGender_len, 0);//性别//
send(g_clientSocket, (const char*)g_szAge, g_szAge_len, 0);//年龄//
send(g_clientSocket, (const char*)g_szSignature, g_szSignature_len, 0);//个性签名//
*/
MessageBox(NULL, L"已将您的注册数据保存到服务器", L"QQ", MB_ICONINFORMATION);
goto door_one;//返回登录和注册选择框//
}
else if (IDCANCEL)//八级判断//
{
goto door_six;
}
}
}
}
else if (result_five == IDCANCEL)//五级判断//
{
goto door_three;//注册对话框//
}
}
}
else if (result_four == IDCANCEL)//四级判断//
{
goto door_one;//返回登录和注册选择框//
}
}
else if (result_two == IDCANCEL)//退出// //三级判断//
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//退出框//
}
}
}
return 0;
}为什么客户端发送了你好客户端后,就断开连接?而且服务器还显示乱码。
#include<winsock2.h>
#include<ws2tcpip.h>
#include<windows.h>
#include<thread>
#include<queue>
#include"resource.h"
#pragma comment(lib,"ws2_32.lib")
HWND g_hInfoDialog = NULL;//对话框句柄//
std::queue<std::wstring>g_msgQueue;//消息队列//
CRITICAL_SECTION g_csMsgQueue;//线程同步锁//
int z = 0;
INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//开始对话框//
{
static UINT_PTR TimeID = 0;//启用定时器//
static HBRUSH hBackgroundBrush = NULL;//背景画刷//
static HBITMAP hBmp = NULL;//位图句柄//
switch (uMsg)
{
case WM_INITDIALOG:
TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟4秒;1为定时器的ID,当定时结束后,传递给wParam的参数为其ID,即1.//
hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色//
hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置//
if (hBmp)
{
SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);
}
else
{
MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR);
}
return (INT_PTR)TRUE;//设置焦点//
case WM_DRAWITEM: {
DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam;
if (pdis->CtlID == IDC_CUSTOM_TEXT) {
SetTextColor(pdis->hDC, RGB(255, 0, 0));
DrawText(pdis->hDC, L"Welcome to QQ's server", -1, &pdis->rcItem,//对话框标题//
DT_CENTER | DT_VCENTER);
}
return (INT_PTR)TRUE;
}
case WM_CTLCOLORDLG:
return (INT_PTR)hBackgroundBrush;
case WM_COMMAND:
if (LOWORD(wParam) == IDSTART)
{
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
case WM_TIMER:
if (wParam == 1)
{
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
case WM_DESTROY:
KillTimer(hwndDlg, TimeID);//销毁定时器//
DeleteObject(hBackgroundBrush);//释放画刷//
DeleteObject(hBmp);//释放位图资源//
break;
case WM_CLOSE:
EndDialog(hwndDlg, IDEND);//关闭对话框//
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框//
{
static UINT_PTR TimeID = 0;//启用定时器//
static HBRUSH hBackgroundBrush = NULL;//背景画刷//
static HBITMAP hBmp = NULL;//位图句柄//
switch (uMsg)
{
case WM_INITDIALOG:
TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒//
hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色//
return (INT_PTR)TRUE;//设置焦点//
case WM_DRAWITEM: {
DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam;
if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) {
SetTextColor(pdis->hDC, RGB(255, 0, 0));
DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题//
DT_CENTER | DT_VCENTER);
}
return (INT_PTR)TRUE;
}
case WM_CTLCOLORDLG:
return (INT_PTR)hBackgroundBrush;
case WM_TIMER:
if (wParam == 1)
{
KillTimer(hwndDlg, TimeID);//销毁定时器//
DeleteObject(hBackgroundBrush);//释放画刷//
EndDialog(hwndDlg, IDOK);//关闭对话框//
}
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hwndDlg, IDEND);//关闭对话框//
break;
}
return (INT_PTR)FALSE;
}
//消息更新函数//
void UpdateDialogContent(HWND hwndDlg)
{
EnterCriticalSection(&g_csMsgQueue);//加锁//
if (!g_msgQueue.empty())//队列非空//
{
std::wstring msg = g_msgQueue.front();//取队首元素//
g_msgQueue.pop();//将队首元素弹出//
int len = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_INFORMATION));//获取当前控件文本长度//
wchar_t* currentText = new wchar_t[len + 1];
GetWindowText(GetDlgItem(hwndDlg, IDC_INFORMATION), currentText, len + 1);//获取当前控件文本//
std::wstring combined=L"";
if (len > 0)
{
if (z)//第一次接收消息时,去除对话框的“等待消息...”//
{
combined = currentText;
combined += L"\r\n";
}
z = 1;
}
combined += msg;
SetDlgItemText(hwndDlg, IDC_INFORMATION, combined.c_str());//更新消息//
delete[] currentText;
}
LeaveCriticalSection(&g_csMsgQueue);//解锁//
}
INT_PTR CALLBACK Dialog_information(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//消息对话框//
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_INFORMATION, L"等待消息...");//更新消息//
return (INT_PTR)TRUE;
case WM_APP_UPDATE_MSG:
UpdateDialogContent(hwndDlg);
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
DestroyWindow(hwndDlg);
g_hInfoDialog = NULL;
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框//
return (INT_PTR)TRUE;
}
}
return (INT_PTR)FALSE;
}
void HandleClient(SOCKET client_server)
{
uint32_t strlen;
int length = recv(client_server, (char*)&strlen, sizeof(strlen), 0);
if (length != sizeof(strlen))
{
MessageBox(NULL, L"主机序转网路序错误", L"QQ", MB_ICONERROR);
closesocket(client_server);
exit(1);
}
strlen = strlen;//网络序转主机序//
char* received = new char[strlen+1];
sockaddr_in clientAddr;
int addrlen = sizeof(clientAddr);
//获取客户端地址//
getpeername(client_server, (sockaddr*)&clientAddr, &addrlen);
char ipStr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(clientAddr.sin_addr), ipStr, INET_ADDRSTRLEN);
//转换为Unicode字符串(WCHAR)
wchar_t wIP[20];
MultiByteToWideChar(CP_UTF8,0,ipStr,-1,wIP,sizeof(wIP)/sizeof(wchar_t));
int x = 0;
while (true)
{
int rec = recv(client_server, received,strlen, 0);
if (rec <= 0)
{
break;
}
received[strlen] = '\0';
int len = MultiByteToWideChar(CP_UTF8,0,received,-1,NULL,0);
WCHAR*received_pro = new WCHAR[len];
MultiByteToWideChar(CP_UTF8, 0, received, -1, received_pro,len);
//获取当前时间//
time_t now = time(0);
tm tm;
localtime_s(&tm, &now);
wchar_t timeBuffer[64];
wcsftime(timeBuffer,sizeof(timeBuffer)/sizeof(wchar_t),L"%Y-%m-%d %H:%M:%S",&tm);
std::wstring fullMessage = L"[";
fullMessage += timeBuffer;
fullMessage += L"][";
fullMessage +=wIP;
fullMessage += L"]";
fullMessage += received_pro;
EnterCriticalSection(&g_csMsgQueue);//加锁//
g_msgQueue.push(std::wstring(fullMessage));//创建副本//
LeaveCriticalSection(&g_csMsgQueue);//解锁//
delete[]received_pro;
delete[]received;
if (x == 0)
{
MessageBox(NULL, L"服务器已成功接收来自客户端的信息", L"QQ", MB_ICONINFORMATION);//只提示一次//
x = 1;
}
//通知现有对话框更新内容//
PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0);
}
MessageBox(NULL, L"服务器已无法接收来自客户端的信息", L"QQ", MB_ICONERROR);
closesocket(client_server);
}
DWORD WINAPI StartServer(LPVOID lpParam)//服务器线程函数//
{
SOCKET server_socket = INVALID_SOCKET;
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字//
if (server_socket == INVALID_SOCKET)
{
MessageBox(NULL, L"服务器套接字创建失败", L"QQ", MB_ICONERROR);
exit(1);
}
else
{
MessageBox(NULL, L"服务器套接字创建成功", L"QQ", MB_ICONINFORMATION);
}
//设置服务器地址//
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;//设置为IPv4//
serverAddr.sin_port = htons(8080);//端口号//
serverAddr.sin_addr.s_addr = INADDR_ANY;//监听所有网卡,即本机的所有IP地址//
bind(server_socket, (sockaddr*)&serverAddr, sizeof(serverAddr));//将套接字与指定的IP地址和端口号关联//
listen(server_socket, 50);//开始监听//
int y = 0;
while (true&&y<=3)
{
SOCKET client_server = accept(server_socket, NULL, NULL);//创建新的套接字//
if (client_server == INVALID_SOCKET)
{
MessageBox(NULL, L"无法创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION);
y++;
continue;
}
MessageBox(NULL, L"成功创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION);
std::thread(HandleClient, client_server).detach();//创建线程//
}
exit(1);
}
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow)
{
InitializeCriticalSection(&g_csMsgQueue);//初始化//
INT_PTR result_one = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one);//开始框//
if (result_one == IDOK)//一级判断//
{
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result)
{
MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR);
WSACleanup();
exit(1);
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
MessageBox(NULL, L"不支持Winsock2.2", L"QQ", MB_ICONERROR);
WSACleanup();
exit(1);
}
MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION);
if (g_hInfoDialog == NULL)//创建消息对话框//
{
g_hInfoDialog = CreateDialog(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_MYDIALOG_INFORMATION),
NULL,
Dialog_information
);
ShowWindow(g_hInfoDialog, SW_SHOW);
}
CreateThread(NULL, 0, StartServer, NULL, 0, NULL);
}
else if (result_one == IDEND)//一级判断//
{
DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框//
}
// 主消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsDialogMessage(g_hInfoDialog, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
WSACleanup();
DeleteCriticalSection(&g_csMsgQueue);
return 0;
}