CSTest/网页请求/SocketC.cpp

276 lines
5.1 KiB
C++
Raw Normal View History

#include "SocketC.h"
//<2F><>ʼ<EFBFBD><CABC>socket
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;
}
}
//<2F><><EFBFBD><EFBFBD>
SocketC::SocketC(int mode)
{
m_mode = mode;
}
//<2F><><EFBFBD><EFBFBD>
SocketC::~SocketC()
{
if (state == 1)
{
Close();
}
}
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SocketC::Connect(string IP, UINT Prot)
{
if (!initSocket())
{//<2F><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7>
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;
//<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>
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);
//<2F><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (connect(sclient, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
WSACleanup();
return false;
}
else
{//<2F><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̽<DFB3><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
state = 1;
rec = std::thread((&SocketC::Receive), this);
return true;
}
}
return FALSE;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>
VOID SocketC::Receive()
{
char* buff = NULL;
while(state)
{
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char buf[1024] = { 0 };
int len = recv(sclient, buf, 1020, 0);
if (len ==SOCKET_ERROR || len == 0)
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
state = 0;
if (Cfunc != NULL)
{
Cfunc();
}
//cout << "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>";
break;
}
if (m_mode == 0)
{//<2F><>ͨģʽֱ<CABD>Ӵ<EFBFBD><D3B4><EFBFBD>
if (Rfunc != NULL)
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)
{
if (Rfunc != NULL)
{
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);
}
len = 0;
ZeroMemory(buff, 10001);
buff = RecvBuff(NULL, len, isStr);
}
}
}
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* SocketC::RecvBuff(char* buf, int& len, int& isStr)
{
MsgHead* h;
//lock_guard<std::mutex> guard(msgLock);
//<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (len != 0)
memcpy_s(tmpBuf + bufLen, len, buf, len);
bufLen += len;
//<2F>жϻ<D0B6><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
if (bufLen > sizeof(MsgHead))
{//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ<CFA2><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
h = (MsgHead*)tmpBuf;
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>
if (bufLen - sizeof(MsgHead) >= h->bufLen)
{//<2F><>ǰ<EFBFBD><C7B0>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy_s(buff, h->bufLen, tmpBuf + sizeof(MsgHead), h->bufLen);
len = h->bufLen;
isStr = h->isStr;
bufLen = bufLen - len - sizeof(MsgHead);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
if (bufLen > 0)
memcpy_s(tmpBuf, bufLen, tmpBuf + sizeof(MsgHead) + len, bufLen);
return buff;
}
}
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
BOOL SocketC::CheckHead(MsgHead* h)
{
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD>Ȳ<EFBFBD><C8B2>ܴ<EFBFBD><DCB4><EFBFBD>10000
if (h->bufLen > 10000)
{
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;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
BOOL SocketC::SendStr(string str)
{
if (str == "")
return FALSE;
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;
}
}
return TRUE;
}
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
VOID SocketC::SetRecvFunc(function<VOID(char*, int)> fun)
{
Rfunc = fun;
}
//<2F><><EFBFBD>öϿ<C3B6><CFBF><EFBFBD><EFBFBD>ӵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
VOID SocketC::SetCloseFunc(function<VOID()> fun)
{
Cfunc = fun;
}
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
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();
}