CSTest/网络服务端/SocketS.cpp

380 lines
8.0 KiB
C++
Raw Normal View History

2024-10-17 15:56:43 +08:00
#include "SocketS.h"
#include <iostream>
#define DOSTART do{
#define DOEND } while (0);
2024-10-17 15:56:43 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
2024-10-17 15:56:43 +08:00
DWORD WINAPI SocketS::ThreadProc(LPVOID lpParameter)
{
SocketS* server = (SocketS*)lpParameter;
HANDLE port = server->hPort;
DWORD len;
2024-10-17 15:56:43 +08:00
ULONG_PTR index;
LPOVERLAPPED lpOverlapped;
while (server->g_flag)
{//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ɶ˿ڵ<CBBF><DAB5><EFBFBD><EFBFBD><EFBFBD>
BOOL bFlag = GetQueuedCompletionStatus(port, &len, &index, &lpOverlapped, INFINITE);
2024-10-23 23:58:57 +08:00
clienInfo* clien = &server->ClienMap[index];
if (bFlag == TRUE && len > 0)
{// <20><><EFBFBD>յ<EFBFBD><D5B5>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ
server->Lock.lock();
if (server->m_mode == 0)
{//<2F><>ͨģʽ
if (server->Rfunc != NULL)
{
server->Rfunc(index, clien->buff, len);
}
ZeroMemory(clien->buff, sizeof(clien->buff));
server->PostRecv(index); // <20><><EFBFBD>Լ<EFBFBD>Ͷ<EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
2024-10-17 15:56:43 +08:00
}
else if (server->m_mode == 1)
{
clien->Rbuflen += len;
DOSTART
if (clien->Rbuflen < sizeof(MsgHead))
break;
if (clien->Rbuflen - sizeof(MsgHead) < clien->h.bufLen)
break;
if (clien->buff == NULL)
break;
if (server->Rfunc == NULL)
break;
if (clien->h.isStr == 1)
{
AES aes;
string str = aes.DecryptionAES(clien->buff, "qwertyuiopasdfgh");
server->Rfunc(index, (char*)str.c_str(), str.length());
}
else
server->Rfunc(index, clien->buff, len);
2024-10-23 23:58:57 +08:00
ZeroMemory(clien->buff, sizeof(clien->buff));
clien->Rbuflen = 0;
DOEND
server->PostRecv(index); // <20><><EFBFBD>Լ<EFBFBD>Ͷ<EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
}
server->Lock.unlock();
2024-10-17 15:56:43 +08:00
}
else
{//<2F>ͻ<EFBFBD><CDBB>˹ر<CBB9>
server->Lock.lock();
if (server->Cfunc != NULL)
2024-10-17 15:56:43 +08:00
{
server->Cfunc(index);
2024-10-17 15:56:43 +08:00
}
server->CloseClien(index);
server->Lock.unlock();
2024-10-17 15:56:43 +08:00
}
2024-10-23 23:58:57 +08:00
2024-10-17 15:56:43 +08:00
}
server->Count--;
2024-10-17 15:56:43 +08:00
return 0;
}
//<2F><><EFBFBD><EFBFBD>
SocketS::SocketS(int mode)
{
m_mode = mode;
}
2024-10-17 15:56:43 +08:00
//<2F><><EFBFBD><EFBFBD>
SocketS::~SocketS()
2024-10-17 15:56:43 +08:00
{
Close();
2024-10-17 15:56:43 +08:00
}
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
VOID SocketS::PostRecv(int index)
2024-10-17 15:56:43 +08:00
{
WSABUF wsabuf{};
clienInfo* clien = &ClienMap[index];
if (m_mode == 0)
{
wsabuf.buf = clien->buff;
wsabuf.len = 1020;
}
else if (m_mode == 1)
2024-10-17 15:56:43 +08:00
{
if (clien->Rbuflen < sizeof(MsgHead))
{//<2F>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>û<EFBFBD><C3BB>Ϣͷ<CFA2><CDB7>
wsabuf.buf = (char*)&clien->h + clien->Rbuflen;
wsabuf.len = sizeof(MsgHead) - clien->Rbuflen;
}
else
{
if (clien->Rbuflen == sizeof(MsgHead))
{//<2F>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
if (!CheckHead(&clien->h))
{//<2F><>Ϣͷ<CFA2><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CloseClien(index);
return;
}
}
wsabuf.buf = clien->buff + (clien->Rbuflen - sizeof(MsgHead));
//ʣ<><CAA3><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1020<32><30>ô<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (clien->h.bufLen - clien->Rbuflen + sizeof(MsgHead) > 1020)
wsabuf.len = 1020;
else
wsabuf.len = clien->h.bufLen - clien->Rbuflen + sizeof(MsgHead);
}
2024-10-17 15:56:43 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɶ˿ڼ<CBBF><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwRecvCount = wsabuf.len;
2024-10-17 15:56:43 +08:00
DWORD dwFlag = 0;
WSARecv(clien->c_Sock, &wsabuf, 1, &dwRecvCount, &dwFlag, &clien->c_Olp, NULL);
2024-10-17 15:56:43 +08:00
//if (ERROR_IO_PENDING != WSAGetLastError())
//{//<2F><>ϢͶ<CFA2><CDB6>ʧ<EFBFBD><CAA7>
// return;
//}
2024-10-17 15:56:43 +08:00
}
//<2F><>ָ<EFBFBD><D6B8><EFBFBD>ͻ<EFBFBD><CDBB>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-10-17 15:56:43 +08:00
int SocketS::PostSend(int index, const char* buf, int len)
{
//<2F>жϿͻ<CFBF><CDBB>˴<CBB4><E6B2BB><EFBFBD><EFBFBD>
2024-10-17 15:56:43 +08:00
if (ClienMap.find(index) != ClienMap.end())
{
if (ClienMap[index].c_Sock != 0)
{
return send(ClienMap[index].c_Sock, buf, len, 0);
}
}
2024-10-23 23:58:57 +08:00
return -1;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
BOOL SocketS::CheckHead(MsgHead* h)
2024-10-23 23:58:57 +08:00
{
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD>Ȳ<EFBFBD><C8B2>ܴ<EFBFBD><DCB4><EFBFBD>10000
if (h->bufLen > 10000)
2024-10-23 23:58:57 +08:00
{
return FALSE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Token<65>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
string str, str1;
str = to_string(h->tm);
str += to_string(h->bufLen);
md5 md;
str1 = md.StringToMD5(str);
str = h->token;
if (str == str1)
{//token<65><6E>ȷ<EFBFBD><C8B7>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʱ<EFBFBD><CAB1>
time_t t1;
time(&t1);
if (abs(t1 - h->tm) < 300)
2024-10-23 23:58:57 +08:00
{
return TRUE;
2024-10-23 23:58:57 +08:00
}
}
return FALSE;
2024-10-17 15:56:43 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
VOID SocketS::Listens()
2024-10-17 15:56:43 +08:00
{
SOCKADDR_IN client;
int iaddrSize = sizeof(SOCKADDR_IN);
while (TRUE)
{//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󶨿ͻ<F3B6A8BF><CDBB><EFBFBD>
ClienMap[g_count].c_Sock = accept(ClienMap[0].c_Sock, (struct sockaddr*)&client, &iaddrSize);
if (INVALID_SOCKET == ClienMap[g_count].c_Sock)
{//<2F>ͻ<EFBFBD><CDBB>˰<EFBFBD><CBB0><EFBFBD>ʧ<EFBFBD><CAA7>
return;
}
HANDLE hPort1 = CreateIoCompletionPort((HANDLE)ClienMap[g_count].c_Sock, hPort, g_count, 0);
if (hPort1 != hPort)
{//<2F><><EFBFBD>ɶ˿ڰ<CBBF><DAB0><EFBFBD>ʧ<EFBFBD><CAA7>
printf("CreateIoCompletionPort <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7> error:%d\n", GetLastError());
closesocket(ClienMap[g_count].c_Sock);
continue;
}
PostRecv(g_count); // Ͷ<><CDB6>recv
std::cout << g_count << "<EFBFBD><EFBFBD><EFBFBD>ӳɹ<EFBFBD>\n";
++g_count; // <20>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>++
2024-10-17 15:56:43 +08:00
}
}
2024-10-17 15:56:43 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL SocketS::Creat(int Prot)
{
if (g_flag == 1)
return FALSE;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_count = 1;
SOCKADDR_IN local;
WSADATA wsaData;
DWORD dwThreadId;
if (WSAStartup(0x0202, &wsaData) != 0)
2024-10-17 15:56:43 +08:00
{
return FALSE;
2024-10-17 15:56:43 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ˿<C9B6>
2024-10-17 15:56:43 +08:00
hPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
//<2F><>ȡCPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
SYSTEM_INFO systemProcessorsCount;
GetSystemInfo(&systemProcessorsCount);
Count = systemProcessorsCount.dwNumberOfProcessors;
g_flag = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
for (int i = 0; i < Count; i++)
2024-10-17 15:56:43 +08:00
{
CreateThread(NULL, 0, ThreadProc, (LPVOID)this, 0, &dwThreadId);
2024-10-17 15:56:43 +08:00
}
//<2F><>ʼ<EFBFBD>󶨷<EFBFBD><F3B6A8B7><EFBFBD><EFBFBD><EFBFBD>
ClienMap[0].c_Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(Prot);
if (::bind(ClienMap[0].c_Sock, (struct sockaddr*)&local, sizeof(SOCKADDR_IN)) != 0)
{//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
g_flag = 0;
PostQueuedCompletionStatus(hPort, 0xFFFFFFFF, 0, NULL);
2024-10-17 15:56:43 +08:00
CloseHandle(hPort);
closesocket(ClienMap[0].c_Sock);
2024-10-17 15:56:43 +08:00
WSACleanup();
return FALSE;
2024-10-17 15:56:43 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>̼߳<DFB3><CCBC><EFBFBD>
listen(ClienMap[0].c_Sock, 5);
ListenClien = new std::thread((&SocketS::Listens), this);
return TRUE;
2024-10-17 15:56:43 +08:00
}
//<2F>رշ<D8B1><D5B7><EFBFBD><EFBFBD><EFBFBD>
2024-10-23 23:58:57 +08:00
void SocketS::Close()
{//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>
if (g_flag == 0)
return;
g_flag = 0;
Lock.lock();
for (auto i = ClienMap.begin(); i != ClienMap.end(); i++)
2024-10-17 15:56:43 +08:00
{
closesocket(i->second.c_Sock);
}
ClienMap.clear();
Lock.unlock();
//<2F>رչ<D8B1><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲߳<DFB3><CCB2>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>˳<EFBFBD>
ListenClien->join();
delete ListenClien;
ListenClien = NULL;
2024-10-17 15:56:43 +08:00
CloseHandle(hPort);
while (Count)
{
Sleep(50);
}
2024-10-17 15:56:43 +08:00
WSACleanup();
}
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
2024-10-23 23:58:57 +08:00
VOID SocketS::SetRecvFunc(function<VOID(int, char*, int)> fun)
2024-10-17 15:56:43 +08:00
{
2024-10-23 23:58:57 +08:00
Rfunc = fun;
}
//<2F><><EFBFBD>ùرտͻ<D5BF><CDBB>˵Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
2024-10-23 23:58:57 +08:00
VOID SocketS::SetCloseFunc(function<VOID(int)> fun)
{
Cfunc = fun;
}
//<2F><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>IP<49>Ͷ˿<CDB6>
2024-10-23 23:58:57 +08:00
VOID SocketS::GetClienName(int index, string& IP, int& Prot)
{
IP = "";
Prot = 0;
if(ClienMap.find(index)!= ClienMap.end())
{
if(ClienMap[index].c_Sock!=0)
{
struct sockaddr_in peerAddr;
int peerLen = sizeof(peerAddr);
getpeername(ClienMap[index].c_Sock, (struct sockaddr*)&peerAddr, &peerLen);
IP = inet_ntoa(peerAddr.sin_addr);
Prot = ntohs(peerAddr.sin_port);
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
int SocketS::SendData(int index,const char* buf, int len, int isStr)
{
if (buf == NULL)
return -1;
if (m_mode == 0)
{//<2F><>ͨģʽ
return PostSend(index, buf, len);
}
else if (m_mode == 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ<CFA2><CDB7><EFBFBD><EFBFBD>token
MsgHead h;
h.bufLen = len;
h.isStr = isStr;
time(&h.tm);
string str = to_string(h.tm);
str += to_string(len);
md5 md;
str = md.StringToMD5(str);
memcpy_s(h.token, str.length(), str.c_str(), str.length());
//<2F>ϲ<EFBFBD><CFB2><EFBFBD>Ϣͷ<CFA2><CDB7><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
char* buff = new char[sizeof(MsgHead) + len];
memcpy_s(buff, sizeof(MsgHead), &h, sizeof(MsgHead));
memcpy_s(buff + sizeof(MsgHead), len, buf, len);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int lenth = PostSend(index, buff, len + sizeof(MsgHead)) - sizeof(MsgHead);
delete[] buff;
if (lenth < 0)
{//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
CloseClien(index);
lenth = -1;
}
return lenth;
2024-10-23 23:58:57 +08:00
}
return -1;
2024-10-23 23:58:57 +08:00
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
BOOL SocketS::SendStr(int index, string str)
{//<2F>ж<EFBFBD><D0B6><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
if (str == "")
return FALSE;
if (m_mode == 0)
{//<2F><>ͨģʽ
if (PostSend(index, str.c_str(), str.length()) == -1)
{
return FALSE;
}
}
else if (m_mode == 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
AES aes;
string sendStr = aes.EncryptionAES(str, "qwertyuiopasdfgh");
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
if (-1 == SendData(index, sendStr.c_str(), sendStr.length(), 1))
{//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
return FALSE;
}
}
return TRUE;
}
//<2F>ر<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>
2024-10-23 23:58:57 +08:00
VOID SocketS::CloseClien(int index)
{
if (ClienMap.find(index) != ClienMap.end())
{//<2F>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4>ڶϿ<DAB6><CFBF><EFBFBD><EFBFBD><EFBFBD>
cout << index << "<EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n";
2024-10-23 23:58:57 +08:00
shutdown(ClienMap[index].c_Sock, SD_BOTH);
closesocket(ClienMap[index].c_Sock);
ClienMap[index].c_Sock = 0;
ClienMap[index].c_Olp.hEvent = NULL;
ClienMap.erase(index);
2024-10-17 15:56:43 +08:00
}
}
2024-10-23 23:58:57 +08:00