#include "stdafx.h"
|
#include "ServerSocket.h"
|
#include "common.h"
|
#include "DeviceManage.h"
|
#include "PermissonManage.h"
|
|
#define HEART_CHECK_TIMES 60 // ÐÄÌø¼ì²âµÄ´ÎÊý
|
|
struct TestData
|
{
|
int type;
|
int len;
|
char data[32];
|
};
|
|
ServerSocket::ServerSocket(bool openHeartCheck):m_openHeartCheck(openHeartCheck)
|
{
|
if (initSocket()) {
|
cout << "init socket ok" << endl;
|
}
|
else {
|
cout << "init socket fail" << endl;
|
}
|
}
|
|
|
ServerSocket::~ServerSocket()
|
{
|
closesocket(m_server); // ¹Ø±Õ·þÎñ¶ËÌ×½Ó×Ö
|
WSACleanup(); // ¹Ø±ÕÍøÂç»·¾³
|
}
|
|
bool ServerSocket::initSocket()
|
{
|
WSAData wsa = { 0 };
|
WSAStartup(MAKEWORD(2, 2), &wsa); // Æô¶¯ÍøÂç»·¾³
|
// SOCK_STREAM:TCPÐÒé
|
// SOCK_DGRAM£ºUDPÐÒé
|
m_server = socket(AF_INET, SOCK_STREAM, 0);
|
SOCKADDR_IN addr;
|
addr.sin_family = AF_INET;
|
addr.sin_port = htons(16888);
|
addr.sin_addr.S_un.S_addr = 0;
|
int ret_bind = ::bind(m_server, (sockaddr*)&addr, sizeof(addr));
|
if (ret_bind) {
|
cout << "bind fail:" << WSAGetLastError() << endl;
|
return false;
|
}
|
int ret_listen = listen(m_server, 5);
|
if (ret_listen) {
|
cout << "listen fail:" << WSAGetLastError() << endl;
|
return false;
|
}
|
// Õý³££¬³É¹¦³õʼ»¯
|
// Æô¶¯acceptÏß³Ì
|
thread accept_thread(&ServerSocket::acceptThread, this);
|
accept_thread.detach(); // °þÀëỊ̈߳¬·ÀÖ¹Òì³£½áÊø
|
// Æô¶¯ÐÄÌø¼ì²âÏß³Ì
|
thread heart_check_thread(&ServerSocket::heartCheckThread, this);
|
heart_check_thread.detach();
|
|
return true;
|
}
|
|
void ServerSocket::acceptThread()
|
{
|
while (true)
|
{
|
SOCKADDR_IN addr;
|
SOCKET client; // µ±Ç°Á¬½ÓÉϵĿͻ§¶ËÌ×½Ó×Ö
|
int len = sizeof(addr);
|
|
cout << "wait for conn..." << endl;
|
client = accept(m_server, (sockaddr*)&addr, &len);
|
cout << "conn client:" << client << endl;
|
|
if (client == SOCKET_ERROR) {
|
cout << "socket error:" << WSAGetLastError() << endl;
|
break;
|
}
|
else if (client == 0) {
|
cout << "socket close:" << WSAGetLastError() << endl;
|
break;
|
}
|
// Õý³£
|
// ½¨Á¢ÐµļüÖµ¶Ô
|
m_clientsMap[client] = HEART_CHECK_TIMES;
|
// ´´½¨³¤Á¬½ÓµÄÏß³Ì
|
thread recv_send_thread(&ServerSocket::recvAndSendThread, this, client);
|
recv_send_thread.detach();
|
}
|
}
|
void ServerSocket::recvAndSendThread(SOCKET client)
|
{
|
while (true) {
|
char buffer[1024] = { 0 };
|
int len_recv = recv(client, buffer, sizeof(buffer), 0);
|
cout << "len_recv:" << len_recv << " client:" << client << endl;
|
if (len_recv <= 0) {
|
cout << "client socket ÒѹرջòÒì³£½áÊø:" << WSAGetLastError() << endl;
|
break;
|
}
|
// Õý³£
|
// ÖØÖÃÐÄÌøãÐÖµ
|
m_clientsMap[client] = HEART_CHECK_TIMES;
|
// ½â°ü´¦Àí
|
cout << "buffer:" << buffer << endl;
|
|
int type = *(int*)buffer;
|
if (type == 100) {
|
TestData* td = (TestData*)buffer;
|
cout << "ÊÕµ½½á¹¹Ìå:" << td->len << " " << td->data << endl;
|
}
|
else if (type == AD_REQ) {
|
// Ìí¼ÓÉ豸
|
cout << "ÊÕµ½Ìí¼ÓÉ豸ÇëÇó" << endl;
|
ADReq *req = (ADReq*)buffer;
|
cout << "É豸Ãû³Æ" << req->devInfo[0].deviceName << endl;
|
|
// µ÷Óà Ìí¼ÓÉ豸 ÒµÎñAPI
|
DeviceManage devMan;
|
devMan.addDeviceBusiness(client, req);
|
}
|
else if (type == QUERY_PMS_REQ) {
|
cout << "²éѯȨÏÞÇëÇó" << endl;
|
QueryPmsReq * req = (QueryPmsReq *)buffer;
|
PermissonManage pmsManage;
|
pmsManage.queryPmsByParam(client, req);
|
|
}
|
else if (type == UPDATE_PMS_REQ) {
|
cout << "¸üÐÂȨÏÞÇëÇó" << endl;
|
UpdatePmsReq * req = (UpdatePmsReq *)buffer;
|
PermissonManage pmsManage;
|
pmsManage.updatePms(client, req);
|
|
}
|
|
// Ô·â²»¶¯µÄ»ØÊÕµ½µÄÄÚÈݸø¶ÔÓ¦¿Í»§¶Ë
|
//send(client, buffer, len_recv, 0);
|
}
|
closesocket(client);
|
}
|
|
void ServerSocket::heartCheckThread()
|
{
|
while (m_openHeartCheck)
|
{
|
// ÂÖѯmap
|
for (auto iter = m_clientsMap.begin();iter != m_clientsMap.end();) {
|
iter->second--; // ãÐÖµµÝ¼õ
|
cout << "client:" << iter->first << " ãÐÖµ:" << iter->second << endl;
|
if (iter->second == 0) {
|
// Á¬½ÓÎÞЧÁË£¬¹Ø±ÕÁ¬½Ó£¬ÔÙɾ³ý
|
cout << "·¢ÏÖÎÞЧ¿Í»§¶ËÁ¬½Ó:" << iter->first << endl;
|
closesocket(iter->first);
|
iter = m_clientsMap.erase(iter); // ½ÓÊÕ·µ»ØÖµ£¬·ÀÖ¹µü´úÆ÷ʧЧ
|
}
|
else {
|
++iter;
|
}
|
}
|
// ¼ä¸ô5Ãë
|
Sleep(5 * 1000); // ˯Ãß5000ºÁÃ룬¾ÍÊÇ5Ãë
|
}
|
}
|