2024-11-23 13:47:53 +08:00
|
|
|
|
#include "SocketC.h"
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC>socket
|
2024-11-23 13:47:53 +08:00
|
|
|
|
bool SocketC::initSocket()
|
|
|
|
|
{
|
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><D7BD>ֿ<EFBFBD>
|
|
|
|
|
WORD w_req = MAKEWORD(2, 2);//<2F>汾<EFBFBD><E6B1BE>
|
|
|
|
|
WSADATA wsadata;
|
|
|
|
|
int err;
|
|
|
|
|
err = WSAStartup(w_req, &wsadata);
|
|
|
|
|
if (err != 0)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>
|
|
|
|
|
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2)
|
|
|
|
|
{
|
|
|
|
|
WSACleanup();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
SocketC::SocketC(int mode)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
m_mode = mode;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
SocketC::~SocketC()
|
|
|
|
|
{
|
|
|
|
|
if (state == 1)
|
|
|
|
|
{
|
|
|
|
|
Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
bool SocketC::Connect(string IP, UINT Prot)
|
|
|
|
|
{
|
|
|
|
|
if (!initSocket())
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
struct addrinfo* answer, hint;
|
|
|
|
|
char ipstr[16] = { 0 };
|
|
|
|
|
ZeroMemory(&hint, sizeof(hint));
|
|
|
|
|
hint.ai_family = AF_INET;
|
|
|
|
|
hint.ai_socktype = SOCK_STREAM;
|
|
|
|
|
SOCKADDR_IN server_addr;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (getaddrinfo(IP.c_str(), NULL, &hint, &answer) == 0)
|
|
|
|
|
{
|
|
|
|
|
server_addr.sin_family = AF_INET;
|
|
|
|
|
server_addr.sin_addr.S_un.S_addr = ((struct sockaddr_in*)(answer->ai_addr))->sin_addr.S_un.S_addr;
|
|
|
|
|
server_addr.sin_port = htons(Prot);
|
|
|
|
|
((SOCKADDR_IN*)&hint.ai_addr)->sin_port = htons(Prot);
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BD><EFBFBD>
|
|
|
|
|
sclient = socket(AF_INET, SOCK_STREAM, 0);
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (connect(sclient, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
WSACleanup();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̽<DFB3><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
state = 1;
|
|
|
|
|
rec = std::thread((&SocketC::Receive), this);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
VOID SocketC::Receive()
|
|
|
|
|
{
|
|
|
|
|
char* buff = NULL;
|
|
|
|
|
while(state)
|
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
char buf[1024] = { 0 };
|
2024-11-24 16:30:28 +08:00
|
|
|
|
int len = recv(sclient, buf, 1020, 0);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (len ==SOCKET_ERROR || len == 0)
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
state = 0;
|
|
|
|
|
if (Cfunc != NULL)
|
|
|
|
|
{
|
|
|
|
|
Cfunc();
|
|
|
|
|
}
|
|
|
|
|
//cout << "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>";
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (m_mode == 0)
|
|
|
|
|
{//<2F><>ͨģʽֱ<CABD>Ӵ<EFBFBD><D3B4><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (Rfunc != NULL)
|
2024-11-24 16:30:28 +08:00
|
|
|
|
Rfunc(buf, len);
|
|
|
|
|
}
|
|
|
|
|
else if (m_mode == 1)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int isStr;
|
|
|
|
|
buff = RecvBuff(buf, len, isStr);
|
|
|
|
|
while (buff)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (Rfunc != NULL)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (isStr == 1)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>
|
|
|
|
|
AES aes;
|
|
|
|
|
string str = aes.DecryptionAES(buff, "qwertyuiopasdfgh");
|
|
|
|
|
Rfunc((char*)str.c_str(), str.length());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
Rfunc(buff, len);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
2024-11-24 16:30:28 +08:00
|
|
|
|
len = 0;
|
2024-11-28 22:22:53 +08:00
|
|
|
|
ZeroMemory(buff, 10001);
|
2024-11-24 16:30:28 +08:00
|
|
|
|
buff = RecvBuff(NULL, len, isStr);
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
char* SocketC::RecvBuff(char* buf, int& len, int& isStr)
|
|
|
|
|
{
|
|
|
|
|
MsgHead* h;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//lock_guard<std::mutex> guard(msgLock);
|
|
|
|
|
//<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (len != 0)
|
|
|
|
|
memcpy_s(tmpBuf + bufLen, len, buf, len);
|
|
|
|
|
bufLen += len;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F>жϻ<D0B6><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (bufLen > sizeof(MsgHead))
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ<CFA2><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
h = (MsgHead*)tmpBuf;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (!CheckHead(h))
|
|
|
|
|
{//<2F><>Ϣͷ<CFA2><CDB7><EFBFBD>Ϲ<EFBFBD><CFB9>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
closesocket(sclient);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
//<2F>жϵ<D0B6>ǰ<EFBFBD><C7B0>Ϣ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (bufLen - sizeof(MsgHead) >= h->bufLen)
|
2024-11-24 16:30:28 +08:00
|
|
|
|
{//<2F><>ǰ<EFBFBD><C7B0>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
memcpy_s(buff, h->bufLen, tmpBuf + sizeof(MsgHead), h->bufLen);
|
|
|
|
|
len = h->bufLen;
|
|
|
|
|
isStr = h->isStr;
|
|
|
|
|
bufLen = bufLen - len - sizeof(MsgHead);
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
if (bufLen > 0)
|
|
|
|
|
memcpy_s(tmpBuf, bufLen, tmpBuf + sizeof(MsgHead) + len, bufLen);
|
2024-11-28 22:22:53 +08:00
|
|
|
|
return buff;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-28 22:22:53 +08:00
|
|
|
|
return NULL;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
|
|
|
|
|
BOOL SocketC::CheckHead(MsgHead* h)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD>Ȳ<EFBFBD><C8B2>ܴ<EFBFBD><DCB4><EFBFBD>10000
|
|
|
|
|
if (h->bufLen > 10000)
|
2024-11-23 13:47:53 +08:00
|
|
|
|
{
|
2024-11-24 16:30:28 +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)
|
|
|
|
|
{
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|
|
|
|
int SocketC::SendData(const char* Data, int len, int isStr)
|
|
|
|
|
{
|
|
|
|
|
if (Data == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
if (m_mode == 0)
|
|
|
|
|
{//<2F><>ͨģʽֱ<CABD>ӷ<EFBFBD><D3B7><EFBFBD>
|
|
|
|
|
return send(sclient, Data, len, 0);
|
|
|
|
|
}
|
|
|
|
|
else if (m_mode == 1)
|
|
|
|
|
{//<2F><><EFBFBD><EFBFBD>token
|
|
|
|
|
MsgHead h;
|
|
|
|
|
h.isStr = isStr;
|
|
|
|
|
h.bufLen = len;
|
|
|
|
|
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());
|
|
|
|
|
char* buff = new char[sizeof(MsgHead) + len];
|
|
|
|
|
memcpy_s(buff, sizeof(MsgHead), &h, sizeof(MsgHead));
|
|
|
|
|
memcpy_s(buff + sizeof(MsgHead), len, Data, len);
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int lenth = send(sclient, buff, len + sizeof(MsgHead), 0) - sizeof(MsgHead);
|
|
|
|
|
delete[] buff;
|
|
|
|
|
if (lenth < 0)
|
|
|
|
|
{
|
|
|
|
|
lenth = -1;
|
|
|
|
|
}
|
|
|
|
|
return lenth;
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
BOOL SocketC::SendStr(string str)
|
|
|
|
|
{
|
|
|
|
|
if (str == "")
|
|
|
|
|
return FALSE;
|
2024-11-24 16:30:28 +08:00
|
|
|
|
if (m_mode == 0)
|
|
|
|
|
{//<2F><>ͨģʽֱ<CABD>ӷ<EFBFBD><D3B7><EFBFBD>
|
|
|
|
|
if (send(sclient, str.c_str(), str.length(), 0) == -1)
|
|
|
|
|
{
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (m_mode == 1)
|
|
|
|
|
{//<2F><><EFBFBD>ܷ<EFBFBD><DCB7>͵<EFBFBD><CDB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
AES aes;
|
|
|
|
|
string sendStr = aes.EncryptionAES(str, "qwertyuiopasdfgh");
|
|
|
|
|
if (-1 == SendData(sendStr.c_str(), sendStr.length(), 1))
|
|
|
|
|
{
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2024-11-23 13:47:53 +08:00
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
VOID SocketC::SetRecvFunc(function<VOID(char*, int)> fun)
|
|
|
|
|
{
|
|
|
|
|
Rfunc = fun;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F><><EFBFBD>öϿ<C3B6><CFBF><EFBFBD><EFBFBD>ӵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
VOID SocketC::SetCloseFunc(function<VOID()> fun)
|
|
|
|
|
{
|
|
|
|
|
Cfunc = fun;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-24 16:30:28 +08:00
|
|
|
|
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-23 13:47:53 +08:00
|
|
|
|
void SocketC::Close()
|
|
|
|
|
{
|
|
|
|
|
if (state != 0)
|
|
|
|
|
{
|
|
|
|
|
state = 0;
|
|
|
|
|
//<2F>ر<EFBFBD><D8B1><EFBFBD><D7BD><EFBFBD>
|
|
|
|
|
shutdown(sclient, SD_BOTH);
|
|
|
|
|
closesocket(sclient);
|
|
|
|
|
//<2F>ͷ<EFBFBD>DLL<4C><4C>Դ
|
|
|
|
|
rec.join();
|
|
|
|
|
}
|
|
|
|
|
WSACleanup();
|
|
|
|
|
}
|