2024-10-17 15:56:43 +08:00
|
|
|
|
#include "SocketS.h"
|
2024-11-23 13:47:53 +08:00
|
|
|
|
#include <iostream>
|
|
|
|
|
#define DOSTART do{
|
|
|
|
|
#define DOEND } while (0);
|
2024-10-17 15:56:43 +08:00
|
|
|
|
|
2024-11-23 13:47:53 +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;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
DWORD len;
|
2024-10-17 15:56:43 +08:00
|
|
|
|
ULONG_PTR index;
|
|
|
|
|
LPOVERLAPPED lpOverlapped;
|
|
|
|
|
|
|
|
|
|
while (server->g_flag)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{//<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];
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (bFlag == TRUE && len > 0)
|
2024-11-28 22:22:53 +08:00
|
|
|
|
{// <20><><EFBFBD>յ<EFBFBD><D5B5>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
server->Lock.lock();
|
2024-11-24 16:30:28 +08:00
|
|
|
|
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
|
|
|
|
}
|
2024-11-24 16:30:28 +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
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
ZeroMemory(clien->buff, sizeof(clien->buff));
|
|
|
|
|
clien->Rbuflen = 0;
|
|
|
|
|
DOEND
|
|
|
|
|
server->PostRecv(index); // <20><><EFBFBD>Լ<EFBFBD>Ͷ<EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>
|
|
|
|
|
}
|
2024-11-28 22:22:53 +08:00
|
|
|
|
server->Lock.unlock();
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
else
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{//<2F>ͻ<EFBFBD><CDBB>˹ر<CBB9>
|
2024-11-28 22:22:53 +08:00
|
|
|
|
server->Lock.lock();
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (server->Cfunc != NULL)
|
2024-10-17 15:56:43 +08:00
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
server->Cfunc(index);
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
2024-11-23 13:47:53 +08:00
|
|
|
|
server->CloseClien(index);
|
2024-11-28 22:22:53 +08:00
|
|
|
|
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
|
|
|
|
}
|
2024-11-23 13:47:53 +08:00
|
|
|
|
server->Count--;
|
2024-10-17 15:56:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
SocketS::SocketS(int mode)
|
|
|
|
|
{
|
|
|
|
|
m_mode = mode;
|
|
|
|
|
}
|
2024-10-17 15:56:43 +08:00
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
SocketS::~SocketS()
|
2024-10-17 15:56:43 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
Close();
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
VOID SocketS::PostRecv(int index)
|
2024-10-17 15:56:43 +08:00
|
|
|
|
{
|
2024-11-28 22:22:53 +08:00
|
|
|
|
WSABUF wsabuf{};
|
2024-11-23 13:47:53 +08:00
|
|
|
|
clienInfo* clien = &ClienMap[index];
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (m_mode == 0)
|
|
|
|
|
{
|
|
|
|
|
wsabuf.buf = clien->buff;
|
|
|
|
|
wsabuf.len = 1020;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
2024-11-24 16:30:28 +08:00
|
|
|
|
else if (m_mode == 1)
|
2024-10-17 15:56:43 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +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;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
else
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
}
|
2024-11-24 16:30:28 +08:00
|
|
|
|
|
2024-11-23 13:47:53 +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;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
WSARecv(clien->c_Sock, &wsabuf, 1, &dwRecvCount, &dwFlag, &clien->c_Olp, NULL);
|
2024-10-17 15:56:43 +08:00
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//if (ERROR_IO_PENDING != WSAGetLastError())
|
|
|
|
|
//{//<2F><>ϢͶ<CFA2><CDB6>ʧ<EFBFBD><CAA7>
|
|
|
|
|
// return;
|
|
|
|
|
//}
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +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)
|
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
|
|
|
|
|
BOOL SocketS::CheckHead(MsgHead* h)
|
2024-10-23 23:58:57 +08:00
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD>Ȳ<EFBFBD><C8B2>ܴ<EFBFBD><DCB4><EFBFBD>10000
|
|
|
|
|
if (h->bufLen > 10000)
|
2024-10-23 23:58:57 +08:00
|
|
|
|
{
|
2024-11-23 13:47:53 +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
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
return TRUE;
|
2024-10-23 23:58:57 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-23 13:47:53 +08:00
|
|
|
|
return FALSE;
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
VOID SocketS::Listens()
|
2024-10-17 15:56:43 +08:00
|
|
|
|
{
|
2024-11-23 13:47:53 +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-11-23 13:47:53 +08:00
|
|
|
|
}
|
2024-10-17 15:56:43 +08:00
|
|
|
|
|
2024-11-23 13:47:53 +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
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
return FALSE;
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
2024-11-23 13:47:53 +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);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<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
|
|
|
|
{
|
2024-11-23 13:47:53 +08:00
|
|
|
|
CreateThread(NULL, 0, ThreadProc, (LPVOID)this, 0, &dwThreadId);
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +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);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
closesocket(ClienMap[0].c_Sock);
|
2024-10-17 15:56:43 +08:00
|
|
|
|
WSACleanup();
|
2024-11-23 13:47:53 +08:00
|
|
|
|
return FALSE;
|
2024-10-17 15:56:43 +08:00
|
|
|
|
}
|
2024-11-23 13:47:53 +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
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<2F>رշ<D8B1><D5B7><EFBFBD><EFBFBD><EFBFBD>
|
2024-10-23 23:58:57 +08:00
|
|
|
|
void SocketS::Close()
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (g_flag == 0)
|
|
|
|
|
return;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
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();
|
2024-11-23 13:47:53 +08:00
|
|
|
|
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);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
while (Count)
|
|
|
|
|
{
|
|
|
|
|
Sleep(50);
|
|
|
|
|
}
|
2024-10-17 15:56:43 +08:00
|
|
|
|
WSACleanup();
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|
|
|
|
int SocketS::SendData(int index,const char* buf, int len, int isStr)
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
}
|
2024-11-24 16:30:28 +08:00
|
|
|
|
return -1;
|
2024-10-23 23:58:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 13:47:53 +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;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
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())
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{//<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
|
|
|
|
|